предисловие
Текст был включен в мой репозиторий 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
Поток имеет самые основные характеристики: «Одно измерение, одно направление», то есть поток одномерный, а поток однонаправленный. Что касается размерности, то мы обычно говорим об одномерной длине, двумерной плоскости, трехмерном пространстве, четырехмерном пространстве-времени... Это та же концепция, и поток одномерен. Односторонний означает, что вы можете читать только в одном направлении (по порядку от начала до конца), вы не можете прочитать определенную позицию, а затем вернуться на предыдущую позицию. Концепция потока в основном такая же, как и концепция фактического потока воды, и вода может течь только в одном направлении, сверху вниз. В какой-то момент мы сделали глоток воды, и в следующий раз, когда мы будем пить в том же месте, это будет уже не та же вода.
Класс файла
Начнем с класса файлов.Класс файлов работает с папками, а не с конкретным содержимым файла, а с папками и файлами.
Конструктор файлового класса
- Создайте объект 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 есть следующие общие методы для получения информации, связанной с файлом.
- Метод демонстрируется следующим образом
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 для создания и удаления файлов и т. д.
- Давайте взглянем
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 есть функция для получения всех файлов и папок в каталоге, тогда результат, полученный функцией, является либо массивом, либо коллекция.
- Методы, как показано ниже
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 предоставляет нам соответствующие функции для решения этой проблемы.
- тестовый класс
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
- public boolean createNewFile() для создания файла
-
конец
Что ж, сегодня я расскажу о некоторых основных понятиях потоков ввода-вывода, добавлю класс File и продолжу работу над нашими потоками завтра.
ежедневные комплименты
Хорошо всем, вышеизложенное является полным содержанием этой статьи. Люди, которые могут видеть это здесь, всеталант.
Творить нелегко. Ваша поддержка и признание — самая большая мотивация для моего творчества. Увидимся в следующей статье.
Six Meridians Excalibur | Text [Original] Если в этом блоге есть какие-то ошибки, прошу покритиковать и посоветовать, буду очень признателен!