1. Концепция: IO Потоки используются для обработки передачи данных между устройствами.
Java работает с данными через потоки
Все объекты, которые Java использует для управления потоками, находятся в пакете ввода-вывода.
Поток делится на два типа в соответствии с рабочими данными: поток байтов и поток символов.
Поток делится на: входной поток, выходной поток.
два, IO Общие базовые классы для потоков
- Абстрактный базовый класс для потоков байтов:
• Входной поток, Выходной поток.
- Абстрактный базовый класс для потоков символов:
• Читатель, писатель.
Примечание. Имена подклассов, производных от этих четырех классов,
Добавьте к имени дочернего класса суффикс имени родительского класса.
• Например: подкласс InputStream FileInputStream.
• Такие как: подкласс Reader FileReader
Три, символьный поток — создать файл
Создайте объект потока и создайте файл хранения данных
• FileWriter fw = новый FileWriter("Test.txt");
Вызовите метод записи объекта потока, чтобы записать данные в поток.
• fw.write("текст");
Закройте ресурс потока и очистите данные потока в файл.
• fw.close();
1. Запишите файл
Пример: пакет ааа;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//Создаем объект потока вывода символов, который может записывать данные символов в файл.
/*
* Поскольку вы записываете текстовые данные в файл, вы должны указать файл (место назначения для хранения данных) при создании объекта.
* Если файл не существует, он будет создан автоматически.
* Если файл существует, он будет перезаписан.
* Если в конструктор добавить true, файл можно перезаписать!
*/
FileWriter fWriter = new FileWriter("D:demo.txt",true);
/*
* Вызвать метод write(string) в объекте Writer для записи данных.
* Фактически данные записываются в буфер временного хранения.
*/
fWriter.write("adfsadfsafa");
fWriter.flush();//Обновляем и записываем данные прямо в место назначения.
fWriter.write("dtrdtrd");//Закрываем поток и закрываем ресурс. Перед закрытием будет вызван метод flush, чтобы сбросить данные из буфера в пункт назначения.
fWriter.close();
}
}
Полное написание:
private static final String LINE_SEPARATOR = System.getProperty("line.separator");//Разрыв строки
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("k:\\demo.txt");
fw.write("abcde" + LINE_SEPARATOR + "hahaha");
} catch (IOException e) {
System.out.println(e.toString());
} finally {
if (fw != null)
try {
fw.close();
} catch (IOException e) {
// code....
Выбросить новое исключение RuntimeException("Не удалось закрыть");
}
}
}
В-четвертых, символьный поток — чтение файла
- Создайте объект потока для загрузки существующего файла в
поток.
• FileReader fr = новый FileReader("Test.txt");
- Создайте массив для временного хранения данных.
• char[] ch = новый char[1024];
- Вызовите метод чтения объекта потока, чтобы прочитать данные в потоке в массив.
середина.
• fr.read(ch);
2. Чтение файла: Требование: Чтение текстового файла. Вывести прочитанные символы на консоль.
//Первый способ записи
package cn.itcast.p3.io.filereader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
//1, создайте объект потока для чтения символьных данных.
/*
* При создании объекта потока чтения необходимо указать файл для чтения. Убедитесь, что файл существует.
* Связывает существующий файл с потоком чтения.
*/
FileReader fr = new FileReader("demo.txt");
int ch = 0;
while((ch=fr.read())!=-1){
System.out.println((char)ch);
Разница между этими двумя методами записи: первый может читать только один символ за раз, а второй может читать несколько символов за раз, уменьшая циклы. Так что второй способ написания более выгоден. |
---|
}
fr.close();
}
}
// Второй способ записи:
package cn.itcast.p3.io.filereader;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("demo.txt");
/*
* Используйте read(char[]) для чтения данных текстового файла.
* Сначала создайте массив символов.
*/
char[] buf = new char[1024];
int len = 0;
while((len=fr.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
fr.close();
}
}
полный код
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
FileReader fr = null;
try {
fr = new FileReader("c:\\test.txt");
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf)) != -1) {
System.out.println(new String(buf, 0, len));
}
} catch (IOException e) {
System.out.println("read-Exception :" + e.toString());
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
System.out.println("close-Exception :" + e.toString());
}
}
}
}
}
Уведомление:
- При определении пути к файлу вы можете использовать «/» или «\\».
- При создании файла, если в каталоге есть файл с таким же именем
файл будет перезаписан.
- При чтении файла должно быть гарантировано, что файл уже существует,
В противном случае возникает исключение.
Упражнение: Скопируйте файлы D на диск E
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//Упражнение: Скопируйте файлы D на диск E
//Первый читается один за другим
public class CopyText {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr = new FileReader("D:\\1.txt");
FileWriter fw = new FileWriter("e:\\2.txt");
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fr.close();
fw.close();
}
}
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
//Второй - прочитать несколько за раз и поместить их в массив
//Упражнение: Скопируйте файлы D на диск E
public class CopyText {
private static final int BUFFER_SIZE = 1024;
public static void main(String[] args) throws IOException {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("D:\\1.txt");
fw = new FileWriter("e:\\2.doc");
char[] buf=new char[BUFFER_SIZE];//Buffer Создаем временный контейнер для буферизации прочитанных символов
int len=0;
while((len=fr.read(buf))!=-1){fw.write(buf, 0, len);}
} catch (Exception e) {
Выбросить новое RuntimeException("Не удалось прочитать и записать");
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
5. Буфер потока символов
Появление буфера повышает эффективность чтения и записи данных
Соответствующий класс: BufferWriter BufferReader
Буфер можно использовать только вместе с потоком, что усиливает функцию потока в потоке.
1. Пример BufferReader:
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class CopyText {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("D:\\1.txt");
BufferedReader bufr=new BufferedReader(fr);
String line=null;
while((line=bufr.readLine())!=null)
System.out.println(line);
bufr.close();
}
}
2. Пример написания BufferedWriter:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterDemo {
private static final String LINE_SEPARATOR = System
.getProperty("line.separator");
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileWriter fw = new FileWriter("buf.txt");
//Чтобы повысить эффективность записи, используйте буфер потока символов для создания объекта буфера для записи символов в поток и укажите связанный объект потока для буферизации
BufferedWriter bufw = new BufferedWriter(fw);
for (int i = 0; i < 4; i++) {
bufw.write("asdfghjk" + i);
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
Упражнение: копирование файлов с помощью BufferedReader и BufferedWriter
import java.io.*;
public class CopyTextByBufTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader(fr);
FileWriter fw = new FileWriter("buf_Copy.txt");
BufferedWriter bufw = new BufferedWriter(fw);
String line = null;
while ((line = bufr.readLine()) != null) {
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
}
}
6. Режим декоратора
- Функции исходных классов были изменены и расширены.
пример:
public class PersonDemo {
public static void main(String[] args) {
Person p = new Person();
p.chiFan();
NewPerson p1 = new NewPerson(p);
p1.chiFan();
}
}
class Person {
void chiFan() {
System.out.println("есть");
}
}
// Этот класс улучшает Person.
class NewPerson {
private Person p;
NewPerson(Person p) {
this.p = p;
}
public void chiFan() {
System.out.println("Аперитив");
p.chiFan();
System.out.println("Десерт");
}
}
Используйте декоратор LineNumberReader, чтобы установить номер строки.
import java.io.*;
public class LineNumberReaderDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr = new FileReader("buf.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String line = null;
lnr.setLineNumber(100);
while ((line = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + line);
}
lnr.close();
}
}
Семь, байтовый поток
- Основная операция такая же, как и с символьным потоком, но она может работать не только с символами, но и с другими медиафайлами.
- FileInputStream считывает поток, а FileOutputStream выводит поток.
1. Пример потока чтения:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
public class ByteStreamDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
demo_read();
}
static void demo_read() throws IOException {
FileInputStream fis = new FileInputStream("IO.txt");
System.out.println(fis.available());
//Первый метод чтения
byte[] buf = new byte[fis.available()];
fis.read(buf);
System.out.println(new String(buf));
//Второй метод чтения, рекомендуется использовать этот
byte[] buf1=new byte[1024];
int len=0;
while((len=fis.read(buf1))!=-1)
{
System.out.print(new String(buf1,0,len));
}
//Третий тип, однобайтовое чтение
/* int ch=0;
while((ch=fis.read())!=-1)
{
System.out.print((char)ch);
}*/
fis.close();
}
}
2. Пример выходного потока FileOutputStream
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
public class ByteStreamDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//demo_read();
demo_write();
}
public static void demo_write() throws IOException {
//1, создайте объект потока байтового вывода. Используется для управления файлами. Создайте новый файл, если он не существует.
FileOutputStream fos = new FileOutputStream("bytedemo.txt");
//2, записать данные. пишется прямо в пункт назначения.
fos.write("abcdefg".getBytes());
fos.close();//Закройте действие ресурса для завершения.
}
}
Восемь, буфер потока байтов
Это также повышает эффективность чтения и записи потока байтов.
BufferedInputStream и BufferedOutputStream
Несколько примеров эффективности чтения файлов:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyMp3Test {
public static void main(String[] args) throws IOException {
copy_4();
}
// Не используйте его, это неэффективно!
public static void copy_4() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\4.mp3");
int ch = 0;
while((ch =fis.read())!=-1){
fos.write(ch);
}
fos.close();
fis.close();
}
// не рекомендуется.
public static void copy_3() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\3.mp3");
byte[] buf = new byte[fis.available()];
fis.read(buf);
fos.write(buf);
fos.close();
fis.close();
}
public static void copy_2() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
BufferedInputStream bufis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("c:\\2.mp3");
BufferedOutputStream bufos = new BufferedOutputStream(fos);
int ch = 0;
while((ch=bufis.read())!=-1){
bufos.write(ch);
}
bufos.close();
bufis.close();
}
public static void copy_1() throws IOException {
FileInputStream fis = new FileInputStream("c:\\0.mp3");
FileOutputStream fos = new FileOutputStream("c:\\1.mp3");
byte[] buf = new byte[1024];
int len = 0;
while((len=fis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
fis.close();
}
}
Девять, конверсионный поток
- InputStreamReader : мост байт-символ. расшифровка.
- OutputStreamWriter: мост символов в байты. кодирование.
- Источник потока преобразования: 1. Мост между потоком символов и потоком байтов. 2. Облегчает работу между потоком символов и потоком байтов.
- Применение потока преобразования: когда все данные в потоке байтов представляют собой символы, более эффективно преобразовать их в поток символов.
Пример: Получить символы, введенные с клавиатуры
import java.io.IOException;
import java.io.InputStream;
public class ReadKey {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
InputStream in = System.in;
int ch = 0;
//метод read() является блокирующим методом
while ((ch = in.read()) != -1) {
if (ch == '\r')
continue;
if (ch == '\n') {
String temp = sb.toString();
if ("over".equals(temp))
break;
System.out.println(temp.toUpperCase());
sb.delete(0, sb.length());
} else {
sb.append((char) ch);
}
}
}
}
Пример 2. Используйте поток преобразования для реализации операции чтения с клавиатуры по одной строке за раз.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class TransStreamDemo {
public static void main(String[] args) throws IOException {
InputStream in = System.in;//байтовый поток
InputStreamReader isr = new InputStreamReader(in);//Мост, преобразующий байты в символы. Трансформировать поток.
BufferedReader bufr = new BufferedReader(isr);//поток символов
OutputStream out = System.out;
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(osw);
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
}
}
Упрощенная версия примера 2:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TransStreamDemo2 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(
System.out));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
}
}
Пример 3: Сохраните введенные символы в файл.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TransStreamDemo2 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("buf.txt")));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
Пример 3: Чтение символов из файла в консоль
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TransStreamDemo2 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("buf.txt")));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
Пример 4: копирование содержимого из одного файла в другой
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TransStreamDemo2 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("buf.txt")));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("buf_Copy.txt")));
String line = null;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
Девять, кодировка символов
- Поток символов появляется для удобства манипулирования символами.
- Что еще более важно, было добавлено преобразование кода.
- Это делается путем создания подкласса потока преобразования.
• Средство чтения входного потока
• Запись выходного потока
- Персонажи могут быть добавлены, когда два объекта построены
набор.
Общие таблицы кодирования:
1. ASCII: американский стандартный код для обмена информацией. Его можно представить 7 битами байта.
2, ISO8859-1: латинская кодовая таблица, европейская кодовая таблица. Он представлен 8 битами байта.
3. GB2312: Китайская кодовая таблица Китая.
4. GBK: Китайская таблица кодировки китайского языка была обновлена, в нее добавлено больше китайских иероглифов.
Нет.
5. Юникод: международный стандартный код, в котором сочетаются различные символы. Весь текст представлен двумя байтами, а язык Java использует юникод.
7. UTF-8: используйте до трех байтов для представления символа.
- Приложение кодирования потока преобразования:
1. Символы можно хранить в указанном формате кодировки.
2. Вы можете указать формат кодирования для интерпретации текстовых данных.
3. Действие по заданию таблицы кодирования завершается конструктором.
- Кодировка символов: кодировка: строка → массив байтов Декодирование: массив байтов → строка
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class TransStreamDemo3 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
write_1();
writeText_2();
writeText_3();// запись в кодировке UTF-8
readText_1();
readText_2();//Чтение файлов в кодировке GBK с кодировкой UTF-8
}
public static void readText_2() throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream(
"gbk_1.txt"), "utf-8");
char[] buf = new char[10];
int len = isr.read(buf);
String str = new String(buf, 0, len);
System.out.println(str);
isr.close();
}
public static void readText_1() throws IOException {
FileReader fr = new FileReader("gbk_1.txt");
char[] buf = new char[10];
int len = fr.read(buf);
String str = new String(buf, 0, len);
System.out.println(str);
fr.close();
}
public static void writeText_3() throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("u8_1.txt"), "UTF-8");
osw.write("Привет");
osw.close();
}
public static void writeText_2() throws IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
"gbk_3.txt"), "GBK");
// Эквивалентно FileWriter fw=new FileWriter("gbk_3.txt"); системное значение по умолчанию — GBK
/*
* Функции этих двух кодов эквивалентны. FileWriter: На самом деле поток преобразования указывает воплощение кодовой таблицы по умолчанию для машины. И объект подкласса этого потока преобразования может облегчить манипулирование текстовыми файлами.
* Вкратце: работа с потоком байтов файла + таблица кодировки по умолчанию машины. Это удобный класс для работы с файлами в соответствии с кодовой таблицей по умолчанию.
*
* Если вам нужно указать конкретную кодировку при работе с текстовым файлом. FileWriter не будет работать. Необходимо использовать потоки преобразования.
*/
osw.write("Привет");
osw.close();
}
public static void write_1() throws IOException {
FileWriter fw = new FileWriter("gbk_1.txt");
fw.write("Привет");
fw.close();
}
}
десять, File своего рода
1. Используется для инкапсуляции файлов или папок в объекты.
2. Удобно оперировать атрибутивной информацией файлов и папок.
3. Объект File можно передать в качестве параметра конструктору потока.
4. Изучите общие методы класса File.
Пример: несколько способов инициализации класса File
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
constructorDemo();
}
public static void constructorDemo()
{
File f1=new File("D:\\1.txt");
System.out.println(f1.exists());
File f2=new File("D:\","1.txt");
System.out.println(f2.exists());
File f3=new File("D:\");
File f4=new File(f3,"a.txt");
System.out.println(f4.exists());
File f5=new File("D:"+File.separator+"1.txt");
System.out.println(f5);
}
}
Примеры часто используемых методов класса File:
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
public class FileMethodDemo {
public static void main(String[] args) {
/*
* Общие методы для файловых объектов.
*
*1, получить. 1.1 Получите имя файла. 1.2 Получите путь к файлу. 1.3 Получите размер файла. 1.4 Получить время модификации файла.
*
* 2, создавать и удалять.
*
*3, приговор.
*
*4, переименовать
*/
getDemo();
// createAndDeleteDemo();
// isDemo();
// renameToDemo();
// listRootsDemo();
}
Вывод: parent:nullname:C:\Users\WH\Workspaces\MyEclipse Professional 2014\Test\IO.txtpath:IO.txtlen:8543time:1470094643508str_time:2016年8月2日07:37:23 |
---|
private static void getDemo() {
// TODO Auto-generated method stub
File file = new File("IO.txt");
String name = file.getName();
Строка absPath = file.getAbsolutePath();//Абсолютный путь
String path = file.getPath();
long len = file.length();
long time = file.lastModified();// время последнего изменения
Date date = new Date(time);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
DateFormat.LONG);
String str_time = dateFormat.format(date);
System.out.println("parent:" + file.getParent());
System.out.println("name:" + absPath);
System.out.println("path:" + path);
System.out.println("len:" + len);
System.out.println("time:" + time);
System.out.println("str_time:" + str_time);
}
}
private static void createAndDeleteDemo() {
//Создаем одноуровневую папку
Выходной результат: falsetruetrue |
---|
File dir = new File("D:\\abc");
boolean b = dir.mkdir();
System.out.println(b);
System.out.println(dir.delete());
//Создаем многоуровневую папку
File dir1=new File("D:\\sds\\ds\\adsa\\sa\\as\\a");
dir1.mkdirs();
System.out.println(dir1.delete());//Хотя выходной результат True, удалить можно только самую нижнюю папку
}
public static void isDemo() throws IOException{
File f = new File("aaa");
Результат вывода: b=true true false |
---|
f.createNewFile();
boolean b = f.exists();
System.out.println("b="+b);
// Лучше сначала определить, существует ли он.
System.out.println(f.isFile());
System.out.println(f.isDirectory());
Результат вывода: getFreeSpace:419413291008getTotalSpace:429492695040getUsableSpace:419413291008C:\D:\E:\H:\ |
---|
}
public static void listRootsDemo() {
File file = new File("d:\");
System.out.println("getFreeSpace:"+file.getFreeSpace());
System.out.println("getTotalSpace:"+file.getTotalSpace());
System.out.println("getUsableSpace:"+file.getUsableSpace());
File[] files = File.listRoots();
for(File file1 : files){
System.out.println(file1);
}
}
public static void renameToDemo() {
File f1 = new File("c:\\9.mp3");
File f2 = new File("d:\\aa.mp3");
boolean b = f1.renameTo(f2);//Переименуйте файл f1 в имя файла f2
System.out.println("b="+b);
}
Пример приложения FileFilter:
import java.io.File;
import java.io.FileFilter;
public class FilterByHidden implements FileFilter {
public boolean accept(File pathname) {
return !pathname.isHidden();
}
}
import java.io.File;
import java.io.FilenameFilter;
public class FilterByJava implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
System.out.println(dir+"---"+name);
return name.endsWith(".txt");
}
}
import java.io.File;
import java.io.FilenameFilter;
public class SuffixFilter implements FilenameFilter{
private String suffix ;
public SuffixFilter(String suffix) {
super();
this.suffix = suffix;
}
@Override
public boolean accept(File dir, String name) {
return name.endsWith(suffix);
}
}
import java.io.File;
public class FistListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
listDemo();
listDemo_2();
listDemo_3();
listDemo_4();
}
/**
* Найти файлы в C, которые не скрыты
*/
public static void listDemo_3() {
File dir = new File("c:\");
File[] files = dir.listFiles(new FilterByHidden());
for(File file : files){
System.out.println(file);
}
}
/**
* Найти все файлы и папки на диске D
*/
public static void listDemo() {
/*
* Получить имена файлов и папок в текущем каталоге, включая скрытые файлы. Каталог должен быть инкапсулирован в объект File, вызывающий метод списка.
* В противном случае возникнет исключение NullPointerException, если доступ к системному каталогу также вызовет исключение NullPointerException.
* Если каталог существует, но не имеет содержимого, будет возвращен массив, но с длиной 0.
*/
File file = new File("D:\");
String[] names = file.list();
System.out.println(names.length);
for (String name : names) {
System.out.println(name);
}
}
/**
* Отфильтровать файлы с расширением .txt
*/
public static void listDemo_2() {
File dir = new File("D:\");
String[] names = dir.list(new SuffixFilter(".txt"));
for (String name : names) {
System.out.println(name);
}
}
/**
* Файлы фильтра FileFilter: сначала пройдитесь, найдите те, которые удовлетворяют условиям, а затем поместите их в массив и выведите их
*/
public static void listDemo_4() {
File dir = new File("D:\");
String[] names = dir.list(new FilterByJava());
for (String name : names) {
System.out.println(name);
}
}
}
Одиннадцать, рекурсия:Функции вызывают сами себя.
Примечание. Обязательно укажите конечное условие при рекурсии.
Сценарий применения: Когда функция должна использоваться повторно.
Уведомление:
* 1, рекурсия должна иметь четкие условия. В противном случае переполнение стека легко.
*2, обратите внимание на количество рекурсий.
Пример: прочитать все файлы в папке
import java.io.File;
public class FileTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File dir = new File("D:");
listAll(dir, 0);
}
public static void listAll(File dir, int level) {
System.out.println(getSpace(level) + dir.getName());
// Получить все текущие папки или файловые объекты в указанном каталоге.
level++;
File[] files = dir.listFiles();
for (int x = 0; x < files.length; x++) {
if (files[x].isDirectory()) {
listAll(files[x], level);
} else
System.out.println(getSpace(level) + files[x].getName());
}
}
private static String getSpace(int level) {
StringBuilder sb = new StringBuilder();
sb.append("|--");
for (int x = 0; x < level; x++) {
sb.insert(0, "| ");
}
return sb.toString();
}
}
Пример: рекурсивно удалить все файлы и папки в папке
import java.io.File;
public class RemoveDirTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File dir = new File("D:\\script copy\\ewwe");
dir.delete();
removeDir(dir);
}
public static void removeDir(File dir) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
removeDir(file);
} else {
System.out.println(file + ":" + file.delete());
}
}
System.out.println(dir+":"+dir.delete());
}
}
Пример: рекурсивный пример, вычисление суммы чисел
public class DiGuiDemo {
/**
* @param args
*/
public static void main(String[] args) {
/*
* Рекурсия:
* Сама функция прямо или косвенно вызывает сама себя.
* Функция используется многократно, и каждый раз, когда она используется, результат участвующей операции связан с предыдущим вызовом.
* В настоящее время вы можете использовать рекурсию для решения проблемы.
* Уведомление:
* 1, рекурсия должна иметь четкие условия. В противном случае переполнение стека легко.
*2, обратите внимание на количество рекурсий.
*/
int sum = getSum(9000);
System.out.println(sum);
}
public static int getSum(int num){
int x = 9;
if(num==1)
return 1;
return num+getSum(num-1);
}
}
двенадцать, Properties собирать
**** Функции:
1, все ключи и значения в этой коллекции являются строковыми типами.
2 данные в коллекции могут быть сохранены в потоке или извлечены из потока.
Обычно эта коллекция используется для управления конфигурационными файлами в виде пар ключ-значение.
пример:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Properties;
import java.util.Set;
/*
* Map
* |--Hashtable
* |--Properties:
* Коллекция свойств:
* Функции:
*1, и ключи, и значения в этой коллекции имеют строковый тип.
* 2, данные в коллекции можно сохранить в поток или получить из потока.
*
* Обычно эта коллекция используется для управления конфигурационными файлами в виде пар ключ-значение.
*/
public class PropertiesDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
PropertiesUpDateAndAdd();
methodDemo_2();
methodDemo_3();
methodDemo_4();
PropertiesReadAndUpdate();
}
/**
* Измените информацию в существующем файле конфигурации. Идея: прочитать этот файл. И сохраните данные ключ-значение в этом файле в коллекцию. Изменение данных через коллекции.
* Храните измененные данные в файл через поток.
* @throws IOException
*/
public static void PropertiesReadAndUpdate() throws IOException {
File file = new File("info.txt");
if (!file.exists()) {
file.createNewFile();
}
FileReader fr = new FileReader(file);
// Создаем коллекцию для хранения информации о конфигурации
Properties prop = new Properties();
// Сохраняем информацию из потока в коллекцию.
prop.load(fr);
prop.setProperty("wangwu", "16");
FileWriter fw = new FileWriter(file);
prop.store(fw, "");
prop.list(System.out);
fw.close();
fr.close();
}
/**
* Прочитайте файл свойств, сохраненный на локальном
* @throws IOException
*/
public static void methodDemo_4() throws IOException {
Properties prop = new Properties();
// Данные в коллекцию поступают из файла.
// Обратите внимание: необходимо убедиться, что данные в файле представляют собой пару ключ-значение. Необходимо использовать поток чтения.
FileInputStream fis = new FileInputStream("info.txt");
// метод загрузки
prop.load(fis);
prop.list(System.out);
}
/**
* Строковая информация о ключе-значении в коллекции постоянно хранится в файле
* @throws IOException
*/
public static void methodDemo_3() throws IOException {
Properties prop = new Properties();
// Сохраняем элемент.
prop.setProperty("zhangsan", "30");
prop.setProperty("lisi", "31");
prop.setProperty("wangwu", "36");
prop.setProperty("zhaoliu", "20");
// Требуется сохранить строковую информацию о ключе-значении в этих коллекциях в файл. Требуется связанный поток вывода.
FileOutputStream fos = new FileOutputStream("info.txt");
prop.store(fos, "info");
fos.close();
}
/**
* Демонстрирует совместную функциональность коллекции свойств и объектов потока.
*/
public static void methodDemo_2() {
Properties prop = System.getProperties();
prop.list(System.out);
}
/**
* Модификации и дополнения к коллекции свойств
*/
public static void PropertiesUpDateAndAdd() {
Properties prop = new Properties();
// элемент хранения
prop.setProperty("Чжан Сан", "30");
prop.setProperty("lisi", "31");
prop.setProperty("wangwu", "36");
prop.setProperty("zhaoliu", "20");
// изменить элемент
prop.setProperty("wangwu", "26");
Set<String> names = prop.stringPropertyNames();
for (String name : names) {
String value = prop.getProperty(name);
System.out.println(name + ":" + value);
}
}
}
Упражнение: определите функцию, получите количество запусков приложения, если оно превышает 5 раз, дайте подсказку, что количество использований достигнуто, пожалуйста, зарегистрируйтесь. И не запускайте программу.
Идеи:
1, должен быть счетчик.
Каждый раз, когда программа запускается, ее нужно считать один раз, и она считается исходное количество раз.
2. Счетчик является переменной. Внезапно возникла идея, считая, что при запуске программы счетчик должен существовать в памяти и выполнять операции.
Но как только программа заканчивается, счетчик пропадает. Затем снова запустите программу, и счетчик снова инициализируется.
И нам нужно запускать одно и то же приложение несколько раз, используя один и тот же счетчик.
Это требует более длительного жизненного цикла счетчика, от хранения в памяти до файлов на жестком диске.
3. Как использовать этот счетчик?
Во-первых, когда программа запускается, она должна прочитать этот файл конфигурации для записи информации счетчика.
Получите последний счет счетчика. И судите по количеству испытаний.
Во-вторых, количество раз автоматически увеличивается, и автоматически увеличивающееся время повторно сохраняется в файле конфигурации.
4. Как хранить и отображать информацию в файле.
Можно напрямую сохранить значение времени, но смысл данных не ясен. Поэтому имя становится очень важным.
Это имеет соответствие между именами и значениями, поэтому вы можете использовать пары ключ-значение.
Но набор карт отношения сопоставления выполнен, и данные на жестком диске должны быть прочитаны, поэтому map+io = Properties.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesTest {
public static void main(String[] args) throws IOException {
getAppCount();
}
/**
* @throws IOException
*/
public static void getAppCount() throws IOException {
File conFile = new File("count.properties");
if (!conFile.exists()) {
conFile.createNewFile();
}
FileInputStream fis = new FileInputStream(conFile);
Properties prop = new Properties();
prop.load(fis);
String value = prop.getProperty("time");
int count = 0;
if (value != null) {
count = Integer.parseInt(value);
if (count >= 5) {
Выбросить новое RuntimeException("Достигнуто количество использований, пожалуйста, зарегистрируйтесь и дайте деньги!");
}
}
count++;
//Восстановить измененное время в коллекцию
prop.setProperty("time", count+"");
FileOutputStream fos=new FileOutputStream(conFile);
prop.store(fos, "count");
fos.close();
fis.close();
}
}
Упражнение: Получить файлы с указанным расширением в указанном каталоге (в том числе в подкаталогах)
Абсолютные пути к этим файлам записываются в текстовый файл. Проще говоря, это создание списка файлов с указанным расширением. Идеи:
1. Должен быть выполнен глубокий обход.
2, для фильтрации в процессе обхода. Храните все подходящее содержимое в контейнере.
3. Просмотрите содержимое контейнера и запишите абсолютный путь к файлу.
package Test23;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File dir = new File("C:\\Users\\WH\\Workspaces\\MyEclipse Professional 2014\\Test");
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
};
List<File> list = new ArrayList<File>();
getFiles(dir, filter, list);
File destFile = new File(dir, "javalist.txt");
write2File(list, destFile);
}
/**
* Глубоко просматривать содержимое в указанном каталоге, фильтровать в соответствии с указанным фильтром и сохранять отфильтрованное содержимое в указанном списке контейнеров.
* @param dir
* @param filter
* @param list
*/
public static void getFiles(File dir, FilenameFilter filter, List<File> list) {
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
// Рекурсивно!
getFiles(file, filter, list);
} else {
// Отфильтровать пройденные файлы. Сохраните подходящие объекты File в коллекции List.
if (filter.accept(dir, file.getName())) {
list.add(file);
}
}
}
}
public static void write2File(List<File> list, File destFile)
throws IOException {
BufferedWriter bufw = null;
try {
bufw = new BufferedWriter(new FileWriter(destFile));
for (File file : list) {
bufw.write(file.getAbsolutePath());
bufw.newLine();
bufw.flush();
}
}
finally {
if (bufw != null)
try {
bufw.close();
} catch (IOException e) {
Выбросить новое исключение RuntimeException("Не удалось закрыть");
}
}
}
}
Суммировать: Правила работы потока:
Причина, по которой нам нужно выяснить это правило, заключается в том, что существует слишком много потоковых объектов, и мы не знаем, какой объект использовать во время разработки.
Хотите знать, какие объекты используются в разработке. Пока ясно через четыре.
1. Определите источник и цель (приемник)
Источник: читатель InputStream
Назначение: Устройство записи выходного потока
2. Уточните, являются ли данные обычными текстовыми данными.
Источник: обычный текст: Reader
Нет: Входной поток
Назначение: простой текст Writer
Нет: выходной поток
На этом этапе вы можете указать, какую систему использовать в требованиях.
3. Укажите конкретное оборудование.
Исходное устройство:
Жесткий диск: файл
Клавиатура: System.in
память: массив
Сеть: поток сокетов
Целевое устройство:
Жесткий диск: файл
Консоль: System.out
память: массив
Сеть: поток сокетов
4. Требуются ли другие дополнительные функции.
1, должен ли он быть эффективным (буфер);
Да, добавить буфер.
2, преобразовать.
Требование 1: Скопируйте текстовый файл.
1. Определите источник и цель.
Источник: читатель InputStream
Назначение: Устройство записи выходного потока
2, это обычный текст?
Да!
Источник: Читатель
Цель: Писатель
3. Укажите конкретное оборудование.
Источник:
Жесткий диск: файл
Цель:
Жесткий диск: файл
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
4. Вам нужны дополнительные функции?
Нужно, нужно быть эффективным.
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
================================================
Требование 2. Прочитайте информацию о вводе с клавиатуры и запишите ее в файл.
1. Определите источник и цель.
Источник: читатель InputStream
Назначение: Устройство записи выходного потока
2. Это обычный текст?
Да,
Источник: Читатель
Цель: Писатель
3, укажите оборудование
Источник:
клавиатура. System.in
Цель:
жесткий диск. Файл
InputStream in = System.in;
FileWriter fw = new FileWriter("b.txt");
Сделать это можно, но хлопотно. Преобразуйте прочитанные байтовые данные в строку. Затем работайте с потоком символов.
4. Нужны дополнительные функции?
необходимость. конвертировать. Преобразование потока байтов в поток символов. Поскольку источником имени является Reader, удобно работать с текстовыми данными.
Поэтому вам нужно преобразовать существующий поток байтов в поток символов. Используйте байты --> символы. InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter("b.txt");
Вам все еще нужен функционал?
Потребность: хотите быть эффективным.
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
===================================================
Требование 3: Отображение данных текстового файла на консоли.
1. Определите источник и цель.
Источник: читатель InputStream
Назначение: Устройство записи выходного потока
2. Это обычный текст?
Да,
Источник: Читатель
Цель: Писатель
3, укажите конкретное оборудование
Источник:
Жесткий диск: файл
Цель:
Консоль: System.out
FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;//PrintStream
4. Нужны дополнительные функции?
нужно, конвертировать.
FileReader fr= new FileReader("a.txt");
OutputStreamWriter osw = new OutputStreamWriter(System.out);
Нужен, эффективен.
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
================================================================
Требование 4: прочитать данные ввода с клавиатуры и отобразить их на консоли.
1. Определите источник и цель.
Источник: читатель InputStream
Назначение: Устройство записи выходного потока
2. Это обычный текст?
Да,
Источник: Читатель
Цель: Писатель
3. Укажите оборудование.
Источник:
Клавиатура: System.in
Цель:
Консоль: System.out
InputStream in = System.in;
OutputStream out = System.out;
4. Определить дополнительные функции?
Его нужно преобразовать, потому что это поток байтов, а операция — текстовые данные.
Так удобнее использовать поток символов для работы.
InputStreamReader isr = new InputStreamReader(System.in);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
Для того, чтобы сделать его эффективным.
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
============================================================
5. Запишите строковые данные на китайском языке в текстовый файл в соответствии с указанной таблицей кодирования.
1. Цель. Выходной поток, писатель
2, это обычный текст, Writer.
3, устройство: файл жесткого диска
FileWriter fw = new FileWriter("a.txt");
fw.write("Привет");
Примечание: Поскольку в требованиях четко указано действие таблицы кодирования.
Тогда вы не сможете использовать FileWriter, потому что FileWriter использует внутреннюю кодовую таблицу по умолчанию.
Можно использовать только его родительский класс. OutputStreamWriter.
OutputStreamWriter получает объект потока вывода байтов. Поскольку это операционный файл, объект должен быть FileOutputStream.
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);
Нужно быть эффективным?
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName));
Когда использовать потоки преобразования?
1. Устройство, соответствующее источнику или получателю, представляет собой поток байтов, но операция представляет собой текстовые данные, и преобразование может использоваться в качестве моста.
Повышение удобства текстовых операций.
2. Если текст операции включает в себя определенную указанную таблицу кодирования, необходимо использовать поток преобразования.
Тринадцать, IO другие классы в пакете
поток печати
• PrintWriter и PrintStream
• Входными потоками и файлами можно управлять напрямую.
Поток печати:
1, предоставляет метод печати для печати значений различных типов данных. и сохранить представление данных.
2. Он не генерирует IOException.
Конструктор, который принимает три типа значений:
* 1, строковый путь.
*2, файловый объект.
* 3, байтовый выходной поток.
пример:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
public class PrintStreamDemo {
public static void main(String[] args) throws IOException {
PrintStream out = new PrintStream("print.txt");
// int by = read();
// write(by);
// out.write(610);//Запись только младших 8 бит,
// out.print(97);//Превратите 97 в символ и распечатайте данные в место назначения как есть.
out.close();
}
}
PrintWriter: поток печати символов.
Параметры конструктора:
1, строковый путь.
2, файловый объект.
3, байтовый выходной поток.
4, поток вывода символов.
пример:
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class PrintWriterDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new FileWriter("out.txt"),true);
String line = null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
out.println(line.toUpperCase());
// out.flush();
}
out.close();
bufr.close();
}
}
поток последовательности
• SequenceInputStream
• Объединение нескольких потоков.
пример:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
public class SequenceInputStreamDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/*
*Требование: объединить данные в файлах 1.txt, 2.txt, 3.txt в один файл.
*/
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for(int x=1; x<=3; x++){
al.add(new FileInputStream(x+".txt"));
}
Enumeration<FileInputStream> en = Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("1234.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
}
Пример вырезания файла:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class SplitFileDemo {
private static final int SIZE = 1024 * 1024;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File file = new File("D:\\Chongqing test data.zip");
splitFile(file);
}
private static void splitFile(File file) throws IOException {
FileInputStream fis = new FileInputStream(file);
byte[] buf = new byte[SIZE];
FileOutputStream fos = null;
int len = 0;
int count = 1;
/*
* При разрезании файла необходимо записать имя разрезаемого файла и количество фрагментированных файлов. для облегчения слияния.
* Эта информация описывается в виде пар ключ-значение. Объект свойств используется
*
*/
Properties prop = new Properties();
File dirFile = new File("D:\\partFiles");
if (!dirFile.exists())
dirFile.mkdir();
while ((len=fis.read(buf))!=-1) {
fos=new FileOutputStream(new File(dirFile,(count++)+".part"));
fos.write(buf,0,len);
fos.close();
}
prop.setProperty("partCount", count+"");
prop.setProperty("fileName", file.getName());
fos=new FileOutputStream(new File(dirFile,count+".properties"));
prop.store(fos, "Save file Info");
fos.close();fis.close();
}
}
Слейте вырезанные файлы, и информация о слиянии будет получена из конфигурационного файла:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;
public class MergerFile {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File dir = new File("D:\\partFiles");
mergeFile_2(dir);
}
public static void mergeFile_2(File dir) throws IOException {
// Получить объект файла конфигурации в указанном каталоге.
File[] files = dir.listFiles(new SuffixFilter(".properties"));
if (files.length != 1)
Выбросить новое RuntimeException(dir + ", в этом каталоге нет файла с расширением Properties или он не уникален");
//Запись файлового объекта.
File conFile=files[0];
//Получить информацию в файле
Properties properties=new Properties();
FileInputStream fis=new FileInputStream(conFile);
properties.load(fis);
String fileName=properties.getProperty("fileName");
int count=Integer.parseInt(properties.getProperty("partCount"));
//Получить все фрагментированные файлы в этом каталоге.
File[] partFiles=dir.listFiles(new SuffixFilter(".part"));
if (partFiles.length!=(count-1)){
Выбросить новое RuntimeException("Фрагментированный файл не соответствует требованиям, номер неверный! Должно быть "+count+");
}
ArrayList<FileInputStream> a1=new ArrayList<FileInputStream>();
for (int i = 0; i < partFiles.length; i++) {
a1.add(new FileInputStream(partFiles[i]));
}
Enumeration<FileInputStream> en=Collections.enumeration(a1);
SequenceInputStream sisStream=new SequenceInputStream(en);
FileOutputStream fos=new FileOutputStream(new File(dir,fileName));
byte[] buf=new byte[1024];
int len=0;
while((len=sisStream.read(buf))!=-1)
{
fos.write(buf,0,len);
}
fos.close();
sisStream.close();
}
}
Объект операции
• ObjectInputStream и ObjectOutputStream
• Объект, которым манипулируют, должен реализовать Serializable (маркерный интерфейс);