Пакет Java.io содержит почти все классы, необходимые для управления вводом и выводом. Все эти классы потоков представляют собой источники ввода и места назначения вывода.
Потоки в пакете Java.io поддерживают множество форматов, таких как базовые типы, объекты, локализованные наборы символов и т. д.
Поток можно понимать как последовательность данных. Входной поток представляет собой чтение данных из источника, а выходной поток представляет запись данных в пункт назначения.
Java обеспечивает мощную и гибкую поддержку ввода-вывода, что делает его более широко используемым при передаче файлов и сетевом программировании.
Но в этом разделе рассматриваются самые основные функции, связанные с потоками и вводом-выводом. Мы изучим эти функции на примерах один за другим.
Консольный ввод Java осуществляется System.in.
Чтобы получить поток символов, привязанный к консоли, вы можете обернуть System.in в объект BufferedReader, чтобы создать поток символов.
Ниже приведен основной синтаксис для создания BufferedReader:
BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in));
После создания объекта BufferedReader мы можем использовать метод read() для чтения символа из консоли или метод readLine() для чтения строки.
Чтобы прочитать символ из объекта BufferedReader, используйте метод read(), синтаксис которого следующий:
intread()throwsIOException
Каждый раз, когда вызывается метод read(), он считывает символ из входного потока и возвращает этот символ как целочисленное значение. Возвращает -1, когда поток заканчивается. Этот метод вызывает исключение IOException.
Следующая программа демонстрирует использование метода read() для непрерывного чтения символов с консоли до тех пор, пока пользователь не введет «q».
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRRead{ publicstaticvoidmain(Stringargs[])throwsIOException { charc; //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); System.out.println("输入字符, 按下'q' 键退出."); //读取字符do{ c=(char)br.read(); System.out.println(c); }while(c!='q'); } }
Результаты компиляции и запуска приведенного выше примера следующие:
输入字符, 按下'q' 键退出. 123abcq 1 2 3 a b c q
Для чтения строки из стандартного ввода необходимо использовать метод readLine() класса BufferedReader.
Его общий формат:
StringreadLine()throwsIOException
Следующая программа читает и отображает строки символов, пока вы не введете слово «конец».
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRReadLines{ publicstaticvoidmain(Stringargs[])throwsIOException { //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); Stringstr; System.out.println("Enterlinesoftext."); System.out.println("Enter'end'toquit."); do{ str=br.readLine(); System.out.println(str); }while(!str.equals("end")); } }
Результаты компиляции и запуска приведенного выше примера следующие:
Enterlinesoftext. Enter'end'toquit. Thisislineone Thisislineone Thisislinetwo Thisislinetwo end end
Как упоминалось ранее, вывод на консоль завершается функциями print() и println(). Эти методы определяются классом PrintStream, а System.out — это ссылка на объект этого класса.
PrintStream наследует класс OutputStream и реализует метод write(). Таким образом, write() также можно использовать для записи операций в консоль.
PrintStream определяет write() в своей простейшей форме следующим образом:
voidwrite(intbyteval)
Этот метод записывает в поток младшие октеты байтового значения.
В следующем примере функция write() используется для вывода на экран символа «A», за которым следует символ новой строки:
importjava.io.*; //演示System.out.write(). publicclassWriteDemo{ publicstaticvoidmain(Stringargs[]){ intb; b='A'; System.out.write(b); System.out.write('n'); } }
Запустите приведенный выше пример, чтобы вывести символ «A» в окно вывода.
A
Примечание. Метод write() используется нечасто, поскольку методы print() и println() более удобны в использовании.
Как упоминалось ранее, поток определяется как последовательность данных. Входной поток используется для чтения данных из источника, а выходной поток используется для записи данных в цель.
На следующем рисунке представлена диаграмма иерархии классов, описывающая входной и выходной поток.
Два важных потока, которые будут обсуждаться ниже, — это FileInputStream и FileOutputStream:
Этот поток используется для чтения данных из файла, а его объекты можно создавать с помощью ключевого слова new.
Для создания объектов используются различные методы конструктора.
Вы можете использовать имя строкового файла, чтобы создать объект входного потока для чтения файла:
InputStreamf=newFileInputStream("C:/java/hello");
Вы также можете использовать файловый объект для создания объекта входного потока для чтения файла. Сначала нам нужно создать файловый объект с помощью метода File():
Filef=newFile("C:/java/hello"); InputStreamf=newFileInputStream(f);
После создания объекта InputStream вы можете использовать следующие методы для чтения потока или выполнения других операций с потоком.
серийный номер | Методы и описание |
---|---|
1 | public void close() бросает IOException{} Закрывает этот входной поток файла и освобождает все системные ресурсы, связанные с этим потоком. Вызывает исключение IOException. |
2 | protected void Finalize()throws IOException {} Этот метод очищает соединение с файлом. Обязательно вызывайте метод close входного потока файла, когда на него больше нет ссылок. Вызывает исключение IOException. |
3 | public int read(int r)throws IOException{} Этот метод считывает указанные байты данных из объекта InputStream. Возвращается как целочисленное значение. Возвращает следующий байт данных или -1, если достигнут конец. |
4 | public int read(byte[] r) выдает IOException{} Этот метод считывает байты r.length из входного потока. Возвращает количество прочитанных байт. Если это конец файла, возвращается -1. |
5 | public int Available() бросает IOException{} Возвращает количество байтов, которые могут быть прочитаны из этого входного потока без блокировки при следующем вызове метода в этом входном потоке. Возвращает целочисленное значение. |
Помимо InputStream, существуют и другие входные потоки. Более подробную информацию можно найти по ссылке ниже:
БайтмассивInputStream
DataInputStream
Этот класс используется для создания файла и записи данных в файл.
Если целевой файл не существует до того, как поток откроет файл для вывода, поток создает файл.
Существует два конструктора, которые можно использовать для создания объектов FileOutputStream.
Создайте объект выходного потока, используя строковое имя файла:
OutputStreamf=newFileOutputStream("C:/java/hello")
Вы также можете использовать файловый объект для создания выходного потока для записи в файл. Сначала нам нужно создать файловый объект с помощью метода File():
Filef=newFile("C:/java/hello"); OutputStreamf=newFileOutputStream(f);
После создания объекта OutputStream вы можете использовать следующие методы для записи в поток или выполнения других операций с потоком.
серийный номер | Методы и описание |
---|---|
1 | public void close() бросает IOException{} Закрывает этот входной поток файла и освобождает все системные ресурсы, связанные с этим потоком. Вызывает исключение IOException. |
2 | protected void Finalize()throws IOException {} Этот метод очищает соединение с файлом. Обязательно вызывайте метод close входного потока файла, когда на него больше нет ссылок. Вызывает исключение IOException. |
3 | public void write(int w)throws IOException{} Этот метод записывает указанные байты в выходной поток. |
4 | public void write(byte[] w) записывает байты длины w.length из указанного массива в OutputStream. |
Помимо OutputStream, существуют и другие выходные потоки. Более подробную информацию можно найти по ссылке ниже:
Байтмассиввыходной поток
DataOutputStream
Вот пример, демонстрирующий использование InputStream и OutputStream:
import java.io.*; public class fileStreamTest { public static void main(String args[]) { try { byte bWrite[] = { 11, 21, 3, 40, 5 }; OutputStream os = new FileOutputStream("test.txt"); for (int x = 0; x < bWrite.length; x++) { os.write(bWrite[x]); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for (int i = 0; i < size; i++) { System.out.print((char) is.read() + " "); } is.close(); } catch (IOException e) { System.out.print("Exception"); } } }
Приведенная выше программа сначала создает файл test.txt, записывает в него заданное число в двоичном виде и выводит его на консоль.
Поскольку приведенный выше код написан в двоичном формате, символы могут быть искажены. Для решения проблемы искаженного кода можно использовать следующие примеры кода:
//文件名:fileStreamTest2.java importjava.io.*; publicclassfileStreamTest2{ publicstaticvoidmain(String[]args)throwsIOException{ Filef=newFile("a.txt"); FileOutputStreamfop=newFileOutputStream(f); //构建FileOutputStream对象,文件不存在会自动新建OutputStreamWriterwriter=newOutputStreamWriter(fop,"UTF-8"); //构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); //写入到缓冲区writer.append("rn"); //换行writer.append("English"); //刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉fop.close(); //关闭输出流,释放系统资源 FileInputStreamfip=newFileInputStream(f); //构建FileInputStream对象InputStreamReaderreader=newInputStreamReader(fip,"UTF-8"); //构建InputStreamReader对象,编码与写入相同 StringBuffersb=newStringBuffer(); while(reader.ready()){ sb.append((char)reader.read()); //转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); //关闭读取流fip.close(); //关闭输入流,释放系统资源 } }
Есть также несколько классов, касающихся файлов и ввода-вывода, которые нам также необходимо знать:
Класс файла(класс)
Класс FileReader(класс)
Класс FileWriter(класс)
В классе File есть два метода, которые можно использовать для создания папок:
Метод mkdir() создает папку и возвращает true в случае успеха и false в случае неудачи. Ошибка означает, что путь, указанный объектом «Файл», уже существует или что папку невозможно создать, поскольку весь путь еще не существует.
Метод mkdirs() создает папку и все ее родительские папки.
В следующем примере создается папка «/tmp/user/java/bin»:
importjava.io.File; publicclassCreateDir{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp/user/java/bin"; Filed=newFile(dirname); //现在创建目录d.mkdirs(); } }
Скомпилируйте и выполните приведенный выше код, чтобы создать каталог «/tmp/user/java/bin».
Примечание. Java автоматически разрешает разделители путей к файлам по соглашению в UNIX и Windows. Если вы используете разделитель (/) в версии Java для Windows, путь по-прежнему будет анализироваться правильно.
Каталог на самом деле представляет собой объект File, который содержит другие файлы и папки.
Если вы создаете объект File и это каталог, вызов метода isDirectory() вернет true.
Вы можете извлечь список содержащихся в нем файлов и папок, вызвав метод list() объекта.
Пример, показанный ниже, иллюстрирует, как использовать метод list() для проверки содержимого папки:
importjava.io.File; publicclassDirList{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp"; Filef1=newFile(dirname); if(f1.isDirectory()){ System.out.println("Directoryof"+dirname); Strings[]=f1.list(); for(inti=0;i<s.length;i++){ Filef=newFile(dirname+"/"+s[i]); if(f.isDirectory()){ System.out.println(s[i]+"是一个目录"); }else{ System.out.println(s[i]+"是一个文件"); } } }else{ System.out.println(dirname+"不是一个目录");
} } }
Результаты компиляции и запуска приведенного выше примера следующие:
目录/tmp bin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
Чтобы удалить файл, используйте метод java.io.File.delete().
Следующий код удалит каталог /tmp/java/. Следует отметить, что при удалении определенного каталога вы должны убедиться, что в каталоге нет других файлов, чтобы удалить его правильно, иначе удаление не удастся.
Структура тестового каталога:
/tmp/Ява/ |-- 1.лог |-- тест
import java.io.File; public class DeleteFileDemo { public static void main(String args[]) { // 这里修改为自己的测试目录File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } }