파일 전송 기초 자바 IO 흐름
아주 유명한 이상 한 현상:windows 수첩 에 파일 을 새로 만 들 고'연결'이라는 두 글 자 를 입력 한 후에 저장 하고 닫 은 다음 에 다시 열 면 이 두 글자 가 이미 사 라 졌 다 는 것 을 알 게 될 것 입 니 다.대신 몇 개의 어 지 러 운 코드 입 니 다!하하,연합 이 이동 을 못 하 는 이유 라 는 말 이 있다.사실 GB 2312 인 코딩 과 UTF 8 인 코딩 이 인 코딩 충돌 을 일 으 킨 이유 다.GB 계열 에서'연결'의 바 이 너 리 인 코딩 은 1100001 10101010 11001110101000 입 니 다.
눈치 채 셨 나 요?첫 번 째 바이트,세 번 째 바이트 의 시작 부분 은 모두'110'과'10'입 니 다.마침 UTF 8 규칙 에 있 는 두 바이트 템 플 릿 과 일치 합 니 다.그래서 다시 수첩 을 열 었 을 때 수첩 은 이것 이 UTF 8 인 코딩 파일 이 라 고 오 해 했 습 니 다.첫 번 째 바이트 의 110 과 두 번 째 바이트 의 10 을 제거 하면 우 리 는'00001 101010'을 얻 고 여러분 을 정렬 합 니 다.선도 적 인 0 을 추가 하면'0000 0000 0110 1010'을 얻 을 수 있 습 니 다.죄송합니다.이것 은 유 니 코드 의 006 A,즉 소문 자'j'입 니 다.그 다음 두 바이트 가 UTF 8 로 디 코딩 한 후에 0368 입 니 다.이 문 자 는 아무것도 아 닙 니 다.이것 이 바로'연결'이라는 두 글자 만 있 는 파일 이 수첩 에 정상적으로 표시 되 지 못 하 는 이유 이다.
만약 에'연결'후에 몇 글 자 를 더 입력 하면 다른 글자 의 인 코딩 이 꼭 110 과 10 으로 시 작 된 바이트 가 아니 라 다시 열 때 수첩 은 utf 8 인 코딩 된 파일 이 라 고 주장 하지 않 고 ANSI 방식 으로 해석 할 것 이다.이때 난 코드 는 나타 나 지 않 는 다.
package com.imooc.io;
import java.io.UnsupportedEncodingException;
/**
* Created by N3verL4nd on 2017/3/8.
*/
public class EncodeDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = " ABC";
byte[] bytes = str.getBytes("GBK");
//gbk , 1
for (byte b : bytes) {
// ( int) 16
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
/**
* ,
* , ,
*/
System.out.println(new String(bytes));//
System.out.println("
" + new String(bytes, "UTF-8"));
System.out.println(new String(bytes, "GBK"));
bytes = str.getBytes("UTF-8");
//UTF-8 , 1
for (byte b : bytes) {
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
System.out.println("
" + new String(bytes));
//java UTF-16BE
bytes = str.getBytes("UTF-16BE");
//utf-16be 2 ,
for (byte b : bytes) {
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
System.out.println("
" + new String(bytes, "UTF-16BE"));
/**
*
*
* ANSI
*/
}
}
c4 bd bf ce 41 42 43
Ľ��ABC
Ľ��ABC
ABC
e6 85 95 e8 af be 41 42 43
ABC
61 55 8b fe 0 41 0 42 0 43
ABC
참고:
http://www.iteedu.com/topic/charset/utf8.php
http://oznyang.iteye.com/blog/30692
https://www.zhihu.com/question/25367290
File 클래스 사용
역할:파일(디 렉 터 리)을 표시 하 는 데 사용 되 며,파일(디 렉 터 리)의 정보 만 표시 할 수 있 으 며,파일 접근 에 사용 할 수 없습니다.
package com.imooc.io;
import java.io.File;
import java.io.IOException;
/**
* Created by N3verL4nd on 2017/3/9.
*/
public class FileDemo {
public static void main(String[] args) {
File file = new File("D:/Java/IdeaProjects/JavaProj/JTest/src/com/imooc/io/doc");
//System.out.println(file.isDirectory());
if (!file.exists()) {
file.mkdir();
System.out.println(" " + file.getAbsolutePath() + " !");
} else {
file.delete();
System.out.println(" " + file.getAbsolutePath() + " !");
}
file = new File("D:/Java/IdeaProjects/JavaProj/JTest/src/com/imooc/io/doc.txt");
//file = new File("D:/Java/IdeaProjects/JavaProj/JTest/src/com/imooc/io/", "doc.txt");
//System.out.println(file.isFile());
if (!file.exists()) {
try {
//
file.createNewFile();
System.out.println(" " + file.getName() + " !");
} catch (IOException e) {
e.printStackTrace();
}
} else {
//
file.delete();
System.out.println(" " + file.getName() + " !");
}
}
}
package com.imooc.io;
import java.io.File;
/**
* Created by N3verL4nd on 2017/3/9.
* File , 、
*/
public class FileUtils {
/**
* ( )
* @param file
*/
public static void listDirectory(File file) throws IllegalArgumentException {
if (!file.exists()) {
throw new IllegalArgumentException(" " + file + " !");
}
if (!file.isDirectory()) {
throw new IllegalArgumentException(file + " !");
}
/*// , ,
for (String patName : file.list()) {
System.out.println(file + "\\" + patName);
}*/
for (File f : file.listFiles()) {
if (f.isFile()) {
System.out.println("[ ]:" + f);
} else if (f.isDirectory()) {
System.out.println("[ ]:" + f.getAbsolutePath());
listDirectory(f);
}
}
}
}
RandomAccessFile 사용
자바 가 제공 하 는 파일 내용 에 대한 접근 은 파일 을 읽 을 수도 있 고 파일 을 쓸 수도 있 습 니 다.
RandomAccessFile 은 임의의 위치 에 접근 할 수 있 는 무 작위 접근 파일 을 지원 합 니 다.
1.자바 파일 모델
하 드 디스크 에 있 는 파일 은 byte byte 에 저 장 된 것 으로 데이터 의 집합 입 니 다.
2.파일 열기
"rw"(읽 기와 쓰기)"r"(읽 기)
RandomAccessFile raf = newRandomAccessFile(file, "rw");
파일 포인터
3.쓰 는 법
raf.write(int)-->한 바이트(후 8 자리)만 쓰 고 파일 포인터 가 다음 위 치 를 가리 키 고 있 습 니 다.
4.읽 는 법
int b=raf.read()---한 바이트 읽 기
5.파일 읽 기와 쓰기 완료 후 반드시 닫 기
raf.close();
package com.imooc.io;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
/**
* Created by N3verL4nd on 2017/3/9.
*/
public class rafDemo {
public static void main(String[] args) throws IOException {
File file = new File("JTest/doc.txt");
if (!file.exists())
file.createNewFile();
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
//
System.out.println(randomAccessFile.getFilePointer());
randomAccessFile.write('A');// 1 'A'-->65-->01000001
System.out.println(randomAccessFile.getFilePointer());
randomAccessFile.write('B');
System.out.println(randomAccessFile.getFilePointer());
int x = 0x7fffffff;
randomAccessFile.write(x >>> 24);// 8
randomAccessFile.write(x >>> 16);
randomAccessFile.write(x >>> 8);
randomAccessFile.write(x);
System.out.println(randomAccessFile.getFilePointer());
//randomAccessFile.writeInt(x);
randomAccessFile.write(" ".getBytes());
System.out.println(" :" + randomAccessFile.length());
// ,
randomAccessFile.seek(0);
byte[] buf = new byte[(int) randomAccessFile.length()];
randomAccessFile.read(buf);
System.out.println(Arrays.toString(buf));
for (byte b : buf) {
System.out.print(Integer.toHexString(b & 0xff) + " ");
}
System.out.println();
System.out.println(new String(buf, "UTF-8"));
randomAccessFile.close();
}
}
바이트 흐름 사용
InputStream:응용 프로그램 이 데 이 터 를 읽 는 방식 을 추상 화 했 습 니 다.
Output Stream:프로그램 이 데 이 터 를 쓰 는 방식 을 추상 화 했 습 니 다.
EOF end of file:1 까지 읽 고 끝 까지 읽 었 습 니 다.
입력 흐름 의 기본 방법:
int b = in.read();int 낮은 8 자리 에 기호 없 이 바이트 읽 기
in.read(byte[] buf);바이트 배열 buf 에 데 이 터 를 읽 고 채 웁 니 다.
in.read(byte[] buf, int start, int size);바이트 배열 buf 에 데 이 터 를 읽 고 buf 의 start 위치 부터 size 길이 의 데 이 터 를 저장 합 니 다.
출력 흐름:
out.write(int b);byte 에서 흐름 까지,b 의 낮은 8 자 를 쓰 십시오.
out.write(byte[]buf)는 buf 바이트 배열 을 흐름 에 기록 합 니 다.
out.write(byte[] buf, int start, int size);
FileInputStream-->파일 에 입력 동작 이 구체 적 으로 구현 되 었 습 니 다.
package com.imooc.io;
import java.io.FileInputStream;
import java.io.IOException;
/**
* Created by N3verL4nd on 2017/3/10.
*/
public class IOUtil {
/**
* , 16
* 10 byte
* @param fileName
*/
public static void printHex(String fileName) throws IOException {
//
FileInputStream in = new FileInputStream(fileName);
int b;
int i = 1;
while ((b = in.read()) != -1) {
i++;
if (b <= 0xf) {
// 0
System.out.print("0");
}
System.out.print(Integer.toHexString(b) + " ");
if (i % 10 == 0) {
System.out.println();
}
}
in.close();
}
public static void printHexByByteArray(String fileName) throws IOException{
FileInputStream in = new FileInputStream(fileName);
byte[] buf = new byte[20 * 1024];
/**
* in , buf
* 0 , buf.length
*
*/
/*int bytes = in.read(buf, 0, buf.length);
int j = 1;
for (int i = 0; i < bytes; i++) {
j++;
if (buf[i] <= 0xf) {
System.out.print("0");
}
System.out.print(Integer.toHexString(buf[i]) + " ");
if (j % 10 == 0) {
System.out.println();
}
}*/
int bytes;
while ((bytes = in.read(buf, 0, buf.length)) != -1) {
int j = 1;
for (int i = 0; i < bytes; i++) {
j++;
if (buf[i] <= 0xf) {
System.out.print("0");
}
System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
if (j % 10 == 0) {
System.out.println();
}
}
}
}
}
FileOutputStream 은 파일 에 byte 데 이 터 를 쓰 는 방법 을 실현 했다.package com.imooc.io;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* Created by N3verL4nd on 2017/3/10.
*/
public class FileOutDemo {
public static void main(String[] args) throws IOException {
// , , ,
FileOutputStream out = new FileOutputStream("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt");
//out.write('A');
//out.write('B');
int x = 3389;
out.write(x >>> 24);
out.write(x >>> 16);
out.write(x >>> 8);
out.write(x);
//out.write(" ".getBytes());
IOUtil.printHex("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt");
out.close();
}
}
package com.imooc.io;
import java.io.*;
/**
* Created by N3verL4nd on 2017/3/10.
*/
public class FileCopy {
public static void Copy(File src, File dst) throws IOException {
if (!src.exists()) {
throw new IllegalArgumentException(src + " !");
}
if (!src.isFile()) {
throw new IllegalArgumentException(src + " !");
}
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dst);
int len;
byte[] buf = new byte[1024];
while ((len = in.read(buf, 0, 1024)) != -1) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
public static void main(String[] args) {
try {
Copy(new File("D:\\N3verL4nd\\Desktop\\Pro.txt"), new File("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
DataOutputStream/DataInputStream
대류 기능 의 확장 은 int,long,문자 등 유형의 데 이 터 를 더욱 편리 하 게 읽 을 수 있 습 니 다.
DataOutputStream
writeInt(),writeDouble(),writeUTF()
package com.imooc.io;
import java.io.*;
/**
* Created by N3verL4nd on 2017/3/11.
*/
public class DosDemo {
public static void main(String[] args) throws IOException {
String filename = "D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt";
DataOutputStream out = new DataOutputStream(new FileOutputStream(filename));
out.writeInt(100);
out.writeDouble(1.1);
// UTF-8
out.writeUTF(" ");
// UTF-16BE
out.writeChars(" ");
out.close();
// IOUtil.printHex(filename);
DataInputStream in = new DataInputStream(new FileInputStream(filename));
System.out.println(in.readInt());
System.out.println(in.readDouble());
System.out.println(in.readUTF());
System.out.println(in.readChar());
System.out.println(in.readChar());
in.close();
}
}
BufferedInputStream/BufferedOutputStream 이 두 흐름 은 IO 에 버퍼 가 있 는 동작 을 제공 합 니 다.일반적으로 파일 을 열 어 읽 기와 쓰 기 를 할 때 버퍼 를 추가 하여 IO 성능 을 향상 시 킵 니 다.
문자 흐름 사용
텍스트 와 텍스트 파일:
자바 의 텍스트(char)는 16 비트 부호 없 는 정수 로 문자 의 유 니 코드 인 코딩(두 바이트 인 코딩)입 니 다.
파일 은 byte byte 의 데이터 시퀀스 입 니 다.
텍스트 파일 은 텍스트 시퀀스 가 어떤 인 코딩 방안(UTF-8/UTF-16BE,GBK)에 따라 byte 로 정렬 된 저장 파일 입 니 다.
문자 흐름(Reader 와 Writer)
문자 처리
문자 의 밑바닥 은 여전히 기본 적 인 바이트 서열 이다
문자 흐름 의 기본 실현
InputStreamReader 는 byte 흐름 을 char 흐름 으로 해석 하고 인 코딩 에 따라 해석 합 니 다.
Output Stream Writer 는 char 를 byte 흐름 으로 제공 하고 인 코딩 에 따라 처리 합 니 다.
package com.imooc.io;
import java.io.*;
/**
* Created by N3verL4nd on 2017/3/12.
*/
public class OSWDemo {
public static void main(String[] args) {
String fileName = "D:\\N3verL4nd\\Desktop\\Pro.txt";
InputStreamReader isr = null;//
try {
isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
} catch (UnsupportedEncodingException | FileNotFoundException e) {
e.printStackTrace();
}
/*try {
int c;
while ((c = isr.read()) != -1) {
System.out.print((char)c);
}
isr.close();
} catch (IOException e) {
e.printStackTrace();
}*/
char[] buf = new char[1024];
int len;
try {
// , buffer , 0 , 1024
//
while ((len = isr.read(buf, 0, 1024)) != -1) {
System.out.print(new String(buf, 0, len));
}
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileReder/FileWriter 는 InputStreamReader/OutputStreamWriter 에서 계승 하여 파일 읽 기와 쓰기 에 더욱 편리 하도록 한다.문자 흐름 필터
Buffered Reader-->readLine 한 줄 씩 읽 기 Buffered Writer-->writeLine 한 줄 씩 쓰기
package com.imooc.io;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* Created by N3verL4nd on 2017/3/12.
*/
public class FRFW {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("D:\\N3verL4nd\\Desktop\\Pro.txt");
int c;
while ((c = reader.read()) != -1) {
System.out.println(c);
}
reader.close();
}
}
package com.imooc.io;
import java.io.*;
/**
* Created by N3verL4nd on 2017/3/10.
*/
public class FileCopy {
public static void Copy(File src, File dst) throws IOException {
if (!src.exists()) {
throw new IllegalArgumentException(src + " !");
}
if (!src.isFile()) {
throw new IllegalArgumentException(src + " !");
}
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dst);
int len;
byte[] buf = new byte[1024];
while ((len = in.read(buf, 0, 1024)) != -1) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
public static void CopyFileByBuffer(File src, File dst) throws IOException {
if (!src.exists()) {
throw new IllegalArgumentException(src + " !");
}
if (!src.isFile()) {
throw new IllegalArgumentException(src + " !");
}
BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dst));
int len;
byte[] buf = new byte[1024];
while ((len = in.read(buf, 0, 1024)) != -1) {
out.write(buf, 0, len);
// out.flush();//
}
in.close();
out.close();
}
public static void main(String[] args) {
try {
long start = System.currentTimeMillis();
CopyFileByBuffer(new File("F:\\H4ck\\bjut\\db.html"), new File("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt"));
//Copy(new File("F:\\H4ck\\bjut\\db.html"), new File("D:\\Java\\IdeaProjects\\JavaProj\\JTest\\doc.txt"));
long end = System.currentTimeMillis();
System.out.println(end - start);
} catch (IOException e) {
e.printStackTrace();
}
}
}
대상 의 직렬 화 와 반 직렬 화
대상 의 서열 화 는 Objext 를 byte 서열 로 바 꾸 는 것 이 고,반대로 반 서열 화 라 고 한다.
직렬 화 흐름:ObjextOutputStream--->writeObject
역 직렬 화:ObjectInputStream--->readObject
직렬 화 인터페이스(Serializable)
대상 은 반드시 직렬 화 인 터 페 이 스 를 실현 해 야 직렬 화 를 할 수 있 으 며,그렇지 않 으 면 이상 이 생 길 것 이다.
이 인 터 페 이 스 는 아무런 방법 도 없고 단지 하나의 표준 일 뿐이다.
package com.imooc.io;
import java.io.*;
/**
* Created by N3verL4nd on 2017/3/12.
*/
public class BRBW {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream("D:\\N3verL4nd\\Desktop\\Pro.txt")
));
while (reader.ready()) {
System.out.println(reader.readLine());
}
reader.close();
}
}
package com.imooc.io;
import java.io.Serializable;
/**
* Created by N3verL4nd on 2017/3/12.
*/
public class Student implements Serializable{
private String stuNO;
private String name;
private int age;
public Student() {
}
public Student(String stuNO, String name, int age) {
this.stuNO = stuNO;
this.name = name;
this.age = age;
}
public String getStuNO() {
return stuNO;
}
public void setStuNO(String stuNO) {
this.stuNO = stuNO;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"stuNO='" + stuNO + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.imooc.io;
import java.io.*;
/**
* Created by N3verL4nd on 2017/3/12.
*/
public class ObjectSerializable {
public static void main(String[] args) {
String fileName = "D:\\Java\\IdeaProjects\\JavaProj\\JTest\\src\\com\\imooc\\io\\doc\\data.dat";
Student student = new Student("10010", "lgh", 24);
try {
//
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName));
// student
out.writeObject(student);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
Student stu = (Student) in.readObject();
System.out.println(stu);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
이 요 소 는 가상 컴퓨터 의 기본 직렬 화 작업 을 하지 않 고 이 요소 의 직렬 화 를 스스로 완성 할 수 있 습 니 다.
Array List 와 관련 된 동작 을 참고 할 수 있 습 니 다.
private transient int age;//
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
elementData = EMPTY_ELEMENTDATA;
// Read in size, and any hidden stuff
s.defaultReadObject();
// Read in capacity
s.readInt(); // ignored
if (size > 0) {
// be like clone(), allocate array based upon size not capacity
ensureCapacityInternal(size);
Object[] a = elementData;
// Read in all elements in the proper order.
for (int i=0; i<size; i++) {
a[i] = s.readObject();
}
}
}
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
// Write out element count, and any hidden stuff
int expectedModCount = modCount;
s.defaultWriteObject();
// Write out size as capacity for behavioural compatibility with clone()
s.writeInt(size);
// Write out all elements in the proper order.
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
}
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
package com.imooc.io;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
/**
* Created by N3verL4nd on 2017/3/12.
*/
public class Student implements Serializable{
private String stuNO;
private String name;
private transient int age;//
public Student() {
}
public Student(String stuNO, String name, int age) {
this.stuNO = stuNO;
this.name = name;
this.age = age;
}
public String getStuNO() {
return stuNO;
}
public void setStuNO(String stuNO) {
this.stuNO = stuNO;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"stuNO='" + stuNO + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
// jvm
s.defaultWriteObject();
// age
s.writeInt(age);
}
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
s.defaultReadObject();
this.age = s.readInt();
}
}
ArrayList 는 배열 의 유효 데이터 요소 의 직렬 화 작업 을 합 니 다.
하나의 클래스 가 직렬 화 인 터 페 이 스 를 실현 하면 그 하위 클래스 는 모두 직렬 화 작업 을 할 수 있다.
서열 화 중성자 류 와 부류 구조 함수 의 호출 문제:
하위 클래스 대상 에 대해 역 직렬 화 작업 을 할 때,
부모 클래스 가 직렬 화 인 터 페 이 스 를 실현 하지 않 으 면 부모 클래스 의 구조 함수 가 호출 된다.
transient Object[] elementData; // non-private to simplify nested class access
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.