🔥Поток ввода-вывода на основе Java (1)

Java

предисловие

Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/bin39232820…
Лучшее время посадить дерево было десять лет назад, затем сейчас
Я знаю, что многие люди не играютqqДа, но с ностальгией, добро пожаловать в группу изучения Java для новичков Six Meridians Excalibur, номер группового чата:549684836Поощряйте всех вести блог на пути к технологиям

болтовня

Зачем писать потоки ввода-вывода, потому что друг группы в группе спрашивал про потоки ввода-вывода, а потом я посмотрел, и у меня в голове стало пусто.Только тогда я понял, насколько слаб мой фундамент, и даже если вы хотите чтобы выучить NIO,вы почти забыли про IO.Как вы можете продолжать учиться?Моя текущая цель очень проста.Шаг за шагом я заложу прочный фундамент для Java,а про многопоточность,блокировки и JVM буду говорить потихоньку , прибыл. Я надеюсь, что я вам нравлюсь, и вы подписываетесь на меня, и вы можете присоединиться к группе, чтобы учиться вместе.Хотя это может не сильно помочь вам, это, по крайней мере, может дать вам атмосферу обучения каждый день.

История ввода/вывода

«Создание хороших систем ввода-вывода — особенно сложная задача для разработчиков языков».

Будь то дизайн системы или дизайн языка, дизайн IO чрезвычайно сложен. Самая большая проблема, как правило, заключается в том, как охватить все возможные факторы, мы не только должны учитывать различные типы файлов, консоли, сеть, память и т. д., но также иметь дело с большим количеством различных методов чтения, таких как: последовательное чтение, произвольное чтение, двоичное чтение, чтение символов, чтение по строке, чтение по символу...

Linux — первая операционная система, которая абстрагирует устройства как файлы.В Linux все внешние устройства могут быть прочитаны путем чтения файлов, так что программисты могут управлять любым устройством, манипулируя файлами. В C++ также внесены некоторые улучшения в IO — введено понятие потока, и мы можем читать и записывать некоторые объекты через cin и cout. Язык Java добился больших успехов в проектировании ввода-вывода.Он полностью объектно-ориентирован, в основном использует шаблон декоратора, чтобы избежать большого количества классов, включая наибольшую возможность, и обеспечивает лучший механизм расширения...

«Разработчики библиотеки Java преодолели эту проблему, создав большое количество классов. Фактически, система ввода-вывода Java использует так много классов, что поначалу кажется, что вы не знаете, с чего начать (по иронии судьбы, система ввода-вывода Java использует так много классов). много классов) Первоначальный замысел проектирования ввода-вывода на самом деле требует избегать слишком большого количества классов)». Приведенный выше абзац взят из статьи «Думай на языке Java». мы знаем цель и место действия шаблона декоратора (Decorator) И его использование в пакете ввода-вывода Java, вы можете по-настоящему оценить всю структуру ввода-вывода.

Подводя итог в одном предложении:Суть компьютера - это ввод, обработка и вывод.Эти вещи не имеют ничего общего с языком, язык - это просто инструмент, точно так же, как если вы хотите пойти куда-то, вы можете ходить, вы также можете взять машину или самолет. Точно такая же цель.

Обзор ввода-вывода

Вспоминая программу, которую я написал раньше, все данные находятся в памяти. После запуска программы данные исчезли. Я хочу использовать данные в следующий раз, но их нет. тогда что нам делать? Можете ли вы сохранить все данные после операции, а затем считать данные и продолжить их использовать при следующем запуске программы? Фактически, для постоянного хранения данных необходимо хранить данные в памяти на других постоянных устройствах (жестких дисках, компакт-дисках, U-дисках и т. д.).

  • Когда вам нужно сохранить данные в памяти на постоянное устройство, это действие называется выводом (записью). Операция вывода
  • Когда данные на постоянном устройстве считываются в память, это действие называется операцией ввода (чтения).
  • Поэтому мы называем это действие ввода-вывода операцией ввода-вывода.

Классификация ИО

Java IO обычно состоит из двух частей:

  • 1. Блокировка IO в пакете java.io;
  • 2. Неблокирующий ввод-вывод в пакете java.nio, обычно называемый NewIO.

Друзья, изучавшие операционные системы, знают, что узким местом работы системы, как правило, являются операции ввода-вывода.Вообще, открытие канала ввода-вывода занимает много времени, а в порту может не хватать данных, поэтому метод чтения ждал читать содержимое порта, тем самым тратя впустую много системных ресурсов. Кто-то может предложить использовать технологию многопоточности в java! Однако создание потока в текущем процессе также требует определенного количества времени и системных ресурсов, поэтому это не всегда желательно. Неблокирующая технология Java New IO в основном использует режим наблюдателя, то есть есть специальный наблюдатель и = мониторинг порта ввода-вывода, и если есть ввод данных, соответствующее приложение будет немедленно уведомлено. Таким образом, мы избегаем создания нескольких потоков, а также избегаем времени ожидания чтения. Однако в этой статье в основном рассказывается о блокирующем вводе-выводе пакета java, который мы обычно используем.

IO в Java в основном состоит из трех частей:

  • 1. Потоковая часть — основная часть IO;
  • 2. Непотоковая часть - в основном включает некоторые классы вспомогательной потоковой части, такие как: класс File, класс RandomAccessFile и FileDescriptor и другие классы;
  • 3. Классы безопасности в части чтения файлов, такие как: класс SerializablePermission. И класс файловой системы, связанный с локальной операционной системой, такой как: класс FileSystem и класс Win32FileSystem и класс WinNTFileSystem.

Потоковую часть можно резюмировать так: два соответствуют одному мосту. Два аналога относятся к:

  • 1. Соответствие между потоком байтов и потоком символов;
  • 2. Соответствие между входом и выходом. Мост относится к мосту от потока байтов к потоку символов. Соответствует вводу и выводу как InputStreamReader и OutputStreamWriter.

В конкретном классе потока его можно разделить на:

  • 1. Медиапоток (Media Stream или Raw Stream) — в основном относится к некоторым базовым потокам, они в основном из конкретных носителей, таких как: файлы, буферы памяти (массив байтов, массив символов, объект StringBuffer) Подождите, прочитайте данные;
  • 2. Filter Stream — в основном относится ко всем подклассам FilterInputStream/FilterOutputStream и FilterReader/FilterWriter, в основном для выполнения определенной обработки обертываемых классов, например кэширования.

Потоки в IO

Поток имеет самые основные характеристики: «Одно измерение, одно направление», то есть поток одномерный, а поток однонаправленный. Что касается размерности, то мы обычно говорим об одномерной длине, двумерной плоскости, трехмерном пространстве, четырехмерном пространстве-времени... Это та же концепция, и поток одномерен. Односторонний означает, что вы можете читать только в одном направлении (по порядку от начала до конца), вы не можете прочитать определенную позицию, а затем вернуться на предыдущую позицию. Концепция потока в основном такая же, как и концепция фактического потока воды, и вода может течь только в одном направлении, сверху вниз. В какой-то момент мы сделали глоток воды, и в следующий раз, когда мы будем пить в том же месте, это будет уже не та же вода.

Класс файла

Начнем с класса файлов.Класс файлов работает с папками, а не с конкретным содержимым файла, а с папками и файлами.

Конструктор файлового класса

image

  • Создайте объект File через конструктор
    public class FileDemo {
    	public static void main(String[] args) {
    		//File构造函数演示
    		String pathName = "e:\\test\\Hello.java";
    		File f1 = new File(pathName);//将Test22文件封装成File对象。注意;有可以封装不存在文件或者文件夹,变成对象。
    		System.out.println(f1);
    		
    		File f2 = new File("e:\\test","Hello.java");
    		System.out.println(f2);
    		
    		//将parent封装成file对象。
    		File dir = new File("e:\\test");
    		File f3 = new File(dir,"Hello.java");
    		System.out.println(f3);
    	}
    }
    
    
        //e:\test\Hello.java
        //e:\test\Hello.java
        //e:\test\Hello.java

Получение класса File

После создания объекта File в классе File есть следующие общие методы для получения информации, связанной с файлом.

image

  • Метод демонстрируется следующим образом
    public class FileMethodDemo {
    	public static void main(String[] args) {
    		//创建文件对象
    		File file = new File("Test22.java");
    		//获取文件的绝对路径,即全路径
    		String absPath = file.getAbsolutePath();
    		//File中封装的路径是什么获取到的就是什么。
    		String path = file.getPath();
    		//获取文件名称
    		String filename = file.getName();
    		//获取文件大小
    		long size = file.length();
    		
    		System.out.println("absPath="+absPath);
    		System.out.println("path="+path);
    		System.out.println("filename="+filename);
    		System.out.println("size="+size);
    	}
    }
    
    //absPath=D:\code\BigData\designPattern\Test22.java
    //path=Test22.java
    //filename=Test22.java
    //size=0

Создание и удаление файлов и папок и т.д.

Мы часто упоминали выше, мы знаем, что мы можем получить имя файла, путь к файлу (каталог) и другую информацию через File. Далее мы демонстрируем использование класса File для создания и удаления файлов и т. д.

image

  • Давайте взглянем
    public class FileMethodDemo2 {
    	public static void main(String[] args) throws IOException {
    		// 对文件或者文件加进行操作。
    		File file = new File("e:\\file.txt");
    		// 创建文件,如果文件不存在,创建 true 。 如果文件存在,则不创建 false。 如果路径错误,IOException。
    		boolean b1 = file.createNewFile();
    		System.out.println("b1=" + b1);
    		//-----------删除文件操作-------注意:不去回收站。慎用------
    		 boolean b2 = file.delete();
    		 System.out.println("b2="+b2);
    
    		//-----------需要判断文件是否存在------------
    		 boolean b3 = file.exists();
    		 System.out.println("b3="+b3);
    
    		//-----------对目录操作 创建,删除,判断------------
    		File dir = new File("e:\\abc");
    		//mkdir()创建单个目录。//dir.mkdirs();创建多级目录
    		boolean b4 = dir.mkdir();
    		System.out.println("b4="+b4);
    		//删除目录时,如果目录中有内容,无法直接删除。
    		boolean b5 = dir.delete();
    		//只有将目录中的内容都删除后,保证该目录为空。这时这个目录才可以删除。
    		System.out.println("b5=" + b5);
    
    		//-----------判断文件,目录------------
    		File f = new File("e:\\javahaha");// 要判断是否是文件还是目录,必须先判断存在。
    		// f.mkdir();//f.createNewFile();
    		System.out.println(f.isFile());
    		System.out.println(f.isDirectory());
    	}
    }
    
                //b1=true
                //b2=true
                //b3=false
                //b4=true
                //b5=true
                //false
                //false


метод listFile()

Файлы хранятся в каталогах (папках), так как же получить все файлы в каталоге или папки в каталоге? Итак, давайте сначала подумаем об этом, в каталоге может быть несколько файлов или папок, затем, если в File есть функция для получения всех файлов и папок в каталоге, тогда результат, полученный функцией, является либо массивом, либо коллекция.

image

  • Методы, как показано ниже
    public class FileMethodDemo3 {
    	public static void main(String[] args) {
    	    File dir = new File("e:\\java_code");
        File file1 = new File(dir, "aaa");
        file1.mkdirs();
        File file2 = new File(dir, "a.text");
        file2.createNewFile();
        dir.mkdirs();
        //获取的是目录下的当前的文件以及文件夹的名称。
        String[] names = dir.list();
        for(String name : names){
            System.out.println(name);
        }
        //获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
        File[] files = dir.listFiles();
        for(File file : files){
            System.out.println(file);
        }

    	}
    }        
         //a.text
         //aaa
         //e:\java_code\a.text
         //e:\java_code\aaa

файловый фильтр

С помощью метода listFiles() мы можем получить все файлы и папки в каталоге, но можем ли мы их отфильтровать? Например, нам нужен только файл с указанным расширением в каталоге или папка, содержащая определенные ключевые слова.

Мы можем сначала получить все файлы и папки в каталоге и просмотреть весь контент, полученный в настоящее время, и отфильтровать в процессе обхода, но это действие немного проблематично, Java предоставляет нам соответствующие функции для решения этой проблемы.

image

image

  • тестовый класс
    public class FileDemo2 {
    	public static void main(String[] args) {
    		//获取扩展名为.java所有文件
    		//创建File对象
    		File file = new File("E:\\test");
    		//获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器
    		File[] files = file.listFiles(new MyFileFilter());
    		//遍历获取到的所有符合条件的文件
    		for (File f : files) {
    			System.out.println(f);
    		}
    	}
    }

  • Пользовательский класс наследует интерфейс фильтра FilenameFilter.
    //定义类实现文件名称FilenameFilter过滤器
    class MyFileFilter implements FilenameFilter{
    	public boolean accept(File dir, String name) {
    		return name.endsWith(".java");
    	}
    }

Стоит отметить, что мы должны обратить внимание на это использование.Это может быть только каталог следующего уровня, а не уровня 2. Например, в примере он должен быть под тестом/, даже если .java под тестом/а не может быть найденным

Рекурсивно печатать ключевые пути во всех подкаталогах

Ха-ха, это одна из вещей, которую мы чаще всего узнаем, когда начинаем изучать документы.

 public static void main(String[] args) throws Exception {
        File file = new File("e:\\test");
        getFileAll(file);

    }
    
    public static void getFileAll(File file) {
        File[] files = file.listFiles();
        //遍历当前目录下的所有文件和文件夹
        for (File f : files) {
            //判断当前遍历到的是否为目录
            if(f.isDirectory()){
                //是目录,继续获取这个目录下的所有文件和文件夹
                getFileAll(f);
            }else{
                //不是目录,说明当前f就是文件,那么就打印出来
                System.out.println(f);
            }
        }
    }
    
    //e:\test\a.txt
    //e:\test\aa\a.java
    //e:\test\aa\a.txt
    //e:\test\b.java
    

FileSummary

  • Файл: абстрактное представление путей к файлам и каталогам.
    • Метод строительства:

      • public File(String pathname) Создайте соответствующий объект File с заданным путем к файлу или папке
      • общедоступный файл (родительская строка, дочерняя строка) Создайте соответствующий объект файла с заданным именем файла или именем каталога по заданному пути к родительской папке
      • общедоступный файл (родительский файл, дочерний элемент строки) Создайте соответствующий объект файла с заданным именем папки или именем файла через путь к каталогу данного объекта файла
    • Классификация путей

      • абсолютный путь с буквой диска
          E:\\work\\a.txt
      
      • относительный путь без буквы диска
          work\\a.txt
      
      • Примечание. При указании пути к файлу, если используется относительный путь, каталогом по умолчанию является корневой каталог проекта.
    • метод

      • public boolean createNewFile() для создания файла
        • Возвращаемое значение истинно, что указывает на успешное создание файла.
        • Возвращаемое значение равно false, что указывает на то, что файл уже существует и его создание завершается ошибкой.
      • public boolean mkdir() создает одноуровневую папку
        • Создать папку успешно, вернуть true
        • Не удалось создать папку, вернуть false
      • public boolean mkdirs() создает многоуровневые папки
      • public boolean delete()
        • удаляет файл или каталог, представленный этим абстрактным путем
        • Если этот путь представляет каталог, каталог должен быть пустым, чтобы удалить
      • public boolean isDirectory() определяет, является ли это папкой
      • public boolean isFile() определяет, является ли это файлом
      • public boolean exists() Определяет, существует ли файл или папка, соответствующие объекту File.
      • public String getAbsolutePath() Получить абсолютный путь к текущему файлу
      • public String getName() Получить имя файла или папки текущего объекта File
      • public long length() Получить размер (в байтах) файла или папки текущего объекта File
      • public File[] listFiles() Получить абсолютные пути ко всем файлам или папкам в каталоге, представленном File

конец

Что ж, сегодня я расскажу о некоторых основных понятиях потоков ввода-вывода, добавлю класс File и продолжу работу над нашими потоками завтра.

ежедневные комплименты

Хорошо всем, вышеизложенное является полным содержанием этой статьи. Люди, которые могут видеть это здесь, всеталант.

Творить нелегко. Ваша поддержка и признание — самая большая мотивация для моего творчества. Увидимся в следующей статье.

Six Meridians Excalibur | Text [Original] Если в этом блоге есть какие-то ошибки, прошу покритиковать и посоветовать, буду очень признателен!