{"id":149,"date":"2021-08-06T00:31:27","date_gmt":"2021-08-06T06:31:27","guid":{"rendered":"https:\/\/iscodigo.wordpress.com\/?p=149"},"modified":"2021-08-06T00:31:27","modified_gmt":"2021-08-06T06:31:27","slug":"archivos-en-java-i-introduccion","status":"publish","type":"post","link":"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/","title":{"rendered":"Archivos en Java I: Introducci\u00f3n"},"content":{"rendered":"\n<p class=\"has-drop-cap\">Hasta ahora los programas realizados consisten en explotar el uso de memoria vol\u00e1til para manejar datos, una vez finaliza un programa \u00e9stos datos se pierden.  Sin embargo, es posible crear aplicaciones que puedan manejar datos que se guarden en archivos dentro de un disco duro, que sean persistentes.<\/p>\n\n\n\n<p>Java, as\u00ed como otros lenguajes, posee una serie de librer\u00edas para manipular archivos, con las operaciones comunes, como ser: creaci\u00f3n, edici\u00f3n y eliminaci\u00f3n de archivos. Adem\u00e1s es posible manipular el contenido interior de cada archivo ya sea leyendo datos o escribiendo datos en el archivo.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_72 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de Contenidos<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#1-_Archivo\" title=\"1- Archivo\">1- Archivo<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#11-_Contenido_de_un_Archivo\" title=\"1.1- Contenido de un Archivo\">1.1- Contenido de un Archivo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#12-_Modo_de_Acceso_de_un_Archivo\" title=\"1.2- Modo de Acceso de un Archivo\">1.2- Modo de Acceso de un Archivo<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#2-_Package_javaio_y_javanio\" title=\"2- Package java.io y java.nio\">2- Package java.io y java.nio<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#21-_Orientado_a_Flujo_stream_vs_Orientado_a_Bufer\" title=\"2.1- Orientado a Flujo (stream) vs Orientado a B\u00fafer\">2.1- Orientado a Flujo (stream) vs Orientado a B\u00fafer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#22-_Bloqueo_de_ES_vs_No_Bloqueo_de_ES\" title=\"2.2- Bloqueo de E\/S vs No Bloqueo de E\/S\">2.2- Bloqueo de E\/S vs No Bloqueo de E\/S<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#23-_Selectores\" title=\"2.3- Selectores\">2.3- Selectores<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#3-_Clases_importantes\" title=\"3- Clases importantes\">3- Clases importantes<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#31-_javaniofilesPath\" title=\"3.1- java.nio.files.Path\">3.1- java.nio.files.Path<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#32-_javaniofilesPaths\" title=\"3.2- java.nio.files.Paths\">3.2- java.nio.files.Paths<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#33-_javaniofilesFiles\" title=\"3.3- java.nio.files.Files\">3.3- java.nio.files.Files<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#34-_javaioIOException\" title=\"3.4- java.io.IOException\">3.4- java.io.IOException<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/iscodigo.com\/blog\/java\/archivos-en-java-i-introduccion\/#Bibliografia\" title=\"Bibliograf\u00eda\">Bibliograf\u00eda<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1-_Archivo\"><\/span>1- Archivo<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Un archivo es un conjunto de bits almacenados en un dispositivo, y accesible a trav\u00e9s de un camino de acceso que lo identifica.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"11-_Contenido_de_un_Archivo\"><\/span>1.1- Contenido de un Archivo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Hay dos formas de visualizar el contenido de un archivo:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><span style=\"text-decoration:underline;\">Archivos de caracteres o de texto<\/span>: El cual es formado por medio de caracteres y puede ser visto y editado en un editor de texto (Por ejemplo: Notepad). Un ejemplo de un archivo de texto es el c\u00f3digo fuente de un archivo Java.<\/li><li><span style=\"text-decoration:underline;\">Archivos de bytes o binarios<\/span>: Formado por los bytes. Este tipo de archivos puede representar casi cualquier cosa, por ejemplo: im\u00e1genes, audio, video, documentos especiales como los de Microsoft Office.<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"12-_Modo_de_Acceso_de_un_Archivo\"><\/span>1.2- Modo de Acceso de un Archivo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ol class=\"wp-block-list\"><li><span style=\"text-decoration:underline;\">Secuencial<\/span>: informaci\u00f3n del archivo es una secuencia de bytes (o caracteres) de manera que para acceder a un byte o car\u00e1cter en particular es necesario acceder a los bytes previos.<\/li><li><span style=\"text-decoration:underline;\">Acceso directo<\/span> (aleatorio): Nos permite acceder directamente a un byte en particular<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2-_Package_javaio_y_javanio\"><\/span>2- Package java.io y java.nio<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"has-normal-font-size\">Java tiene dos packages para la manipulaci\u00f3n de archivos: <strong>java.io<\/strong> y <strong>java.nio<\/strong>. El primero se introdujo en el JDK 1.4, mientras que el segundo fue en el JDK 7. La diferencia m\u00e1s grande entre las dos librer\u00edas consiste en lo siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table class=\"has-fixed-layout\"><thead><tr><th>java.io<\/th><th>java.nio<\/th><\/tr><\/thead><tbody><tr><td>Orientado a flujo (stream)<\/td><td>Orientado a b\u00fafer<\/td><\/tr><tr><td>Bloqueo de E\/S<\/td><td>No hay bloqueo de E\/S<\/td><\/tr><tr><td><\/td><td>Selectores<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"21-_Orientado_a_Flujo_stream_vs_Orientado_a_Bufer\"><\/span>2.1- Orientado a Flujo (stream) vs Orientado a B\u00fafer<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Java IO est\u00e1 orientado al flujo significa que lee uno o m\u00e1s bytes a la vez. No se almacenan en cach\u00e9 en ninguna parte. Adem\u00e1s, no puede avanzar y retroceder en los datos en una secuencia. Si necesita avanzar y retroceder en los datos le\u00eddos de una secuencia, primero deber\u00e1 almacenarlos en un b\u00fafer.<\/p>\n\n\n\n<p>En NIO se trabaja con canales y b\u00fafer. Los datos se escriben de un b\u00fafer hacia un canal, y son le\u00eddos de un canal hacia un buffer. Los datos se leen en un b\u00fafer desde el que luego se procesan. Puede moverse hacia adelante y hacia atr\u00e1s en el b\u00fafer seg\u00fan lo necesite. Esto le brinda un poco m\u00e1s de flexibilidad durante el procesamiento. Sin embargo, tambi\u00e9n debe verificar si el b\u00fafer contiene todos los datos que necesita para procesarlo por completo. Y, debe asegurarse de que al leer m\u00e1s datos en el b\u00fafer, no sobrescriba los datos en el b\u00fafer que a\u00fan no ha procesado. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"22-_Bloqueo_de_ES_vs_No_Bloqueo_de_ES\"><\/span>2.2- Bloqueo de E\/S vs No Bloqueo de E\/S<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Los flujos de Java IO bloquean. Eso significa que cuando un <a href=\"https:\/\/es.wikipedia.org\/wiki\/Hilo_(inform%C3%A1tica)\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"hilo de ejecuci\u00f3n (abre en una nueva pesta\u00f1a)\">hilo de ejecuci\u00f3n<\/a> invoca la lectura o escritura de un archivo, ese hilo se bloquea hasta que haya algunos datos para leer, o los datos est\u00e9n completamente escritos. El hilo no puede hacer nada m\u00e1s mientras tanto.<\/p>\n\n\n\n<p>El modo sin bloqueo de Java NIO permite que un hilo solicite datos de lectura de un canal y solo obtenga lo que est\u00e1 disponible actualmente; o nada en absoluto, si no hay datos disponibles actualmente. En lugar de permanecer bloqueado hasta que los datos est\u00e9n disponibles para leer, el hilo puede continuar con otra cosa.<\/p>\n\n\n\n<p>Lo mismo es cierto para la escritura sin bloqueo. Un sub-proceso puede solicitar que se escriban algunos datos en un canal, pero no esperar a que se escriban completamente. El hilo puede continuar y hacer otra cosa mientras tanto.<\/p>\n\n\n\n<p>Mientras tanto, en qu\u00e9 sub-procesos pasan su tiempo inactivo cuando no est\u00e1n bloqueados en las llamadas IO, generalmente se realiza IO en otros canales. Es decir, un solo hilo ahora puede gestionar m\u00faltiples canales de entrada y salida.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"23-_Selectores\"><\/span>2.3- Selectores<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p> Java NIO provee el concepto de selectores. Los selectores permiten que un solo hilo monitoree m\u00faltiples canales de entrada para eventos como que los datos han llegado, la conexion ha sido abierta, etc. Puede registrar m\u00faltiples canales con un selector, luego usar un solo hilo para \u00abseleccionar\u00bb los canales que tienen entrada disponible para el procesamiento, o seleccionar los canales que est\u00e1n listos para escribir. Este mecanismo de selecci\u00f3n facilita que un solo hilo administre m\u00faltiples canales.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3-_Clases_importantes\"><\/span>3- Clases importantes<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"31-_javaniofilesPath\"><\/span>3.1- java.nio.files.Path<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Un objeto que puede usarse para ubicar un archivo en un sistema de archivos. Normalmente representar\u00e1 una ruta de archivo dependiente del sistema. Posee una serie de funciones \u00fatiles para manejar ubicaciones.<\/p>\n\n\n\n<p>Entre las funciones de estos objetos se tiene:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>endsWith<\/li><li>getFileName<\/li><li>getFileSystem<\/li><li>getParent<\/li><li>getRoot<\/li><li>isAbsolute<\/li><li>startsWith<\/li><li>toAbsolutePath<\/li><li>toFile<\/li><li>toString<\/li><li>toUri<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"32-_javaniofilesPaths\"><\/span>3.2- java.nio.files.Paths<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Esta clase permite que a partir de un String se obtenga un objeto de tipo Path. Esto se realiza con el m\u00e9todo <code>get()<\/code><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-incrustado wp-block-embed-incrustado\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/gist.github.com\/senquevila\/d53d2371331834c8c3e59d10889d1157\n<\/div><figcaption>Algunas funciones de la clase Path y Paths<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"33-_javaniofilesFiles\"><\/span>3.3- java.nio.files.Files<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Esta clase posee funciones static para operar archivos, directorios. En la mayor\u00eda de los casos, los m\u00e9todos definidos delegar\u00e1n al proveedor del sistema de archivos asociado para realizar las operaciones de archivo.<\/p>\n\n\n\n<p>Entre las funciones que se tienen est\u00e1n:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>copy<\/li><li>createDirectories<\/li><li>delete<\/li><li>deleteIfExists<\/li><li>exists<\/li><li>isHidden<\/li><li>isReadable<\/li><li>isSameFile<\/li><li>isWritable<\/li><li>move<\/li><li>readAllBytes<\/li><li>readAllLines<\/li><li>size<\/li><li>write<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-embed is-type-rich is-provider-incrustado wp-block-embed-incrustado\"><div class=\"wp-block-embed__wrapper\">\nhttps:\/\/gist.github.com\/senquevila\/aa73280bbc445c575321a02275660370\n<\/div><figcaption>Algunas funciones de clase Files<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"34-_javaioIOException\"><\/span>3.4- java.io.IOException<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>En el manejo de archivos es posible obtener una excepci\u00f3n del tipo IOException, para lo cual es necesario establecer en las cabeceras de las funciones o en los bloques try\/catch este tipo de objetos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Bibliografia\"><\/span>Bibliograf\u00eda<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>[1] https:\/\/dzone.com\/articles\/java-nio-vs-io<\/p>\n\n\n\n<p>[2] https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/nio\/file\/Path.html<\/p>\n\n\n\n<p>[3] https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/nio\/file\/Paths.html<\/p>\n\n\n\n<p>[4] https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/nio\/file\/Files.html<\/p>\n\n\n\n<p>[5] https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/io\/IOException.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hasta ahora los programas realizados consisten en explotar el uso de memoria vol\u00e1til para manejar datos, una vez finaliza un programa \u00e9stos datos se pierden. Sin embargo, es posible crear aplicaciones que puedan manejar datos que se guarden en archivos dentro de un disco duro, que sean persistentes. Java, as\u00ed como otros lenguajes, posee una [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6],"tags":[26],"class_list":["post-149","post","type-post","status-publish","format-standard","hentry","category-java","tag-io"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts\/149","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/comments?post=149"}],"version-history":[{"count":0,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/posts\/149\/revisions"}],"wp:attachment":[{"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/media?parent=149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/categories?post=149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iscodigo.com\/blog\/wp-json\/wp\/v2\/tags?post=149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}