1.字符串中的编码解码问题
字符串转字节 --编码
byte[] |
getBytes() 使用平台的默认字符集将此 |
byte[] |
getBytes(Charset charset) 使用给定的charset将该 |
字节转字符串 --解码
String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 |
String(byte[] bytes, Charset charset) 构造一个新的 |
package com.itheima_01;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/*
编码:
byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
解码:
String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String
*/
public class StringDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
//定义一个字符串
String s = "中国";
//byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
//byte[] bys = s.getBytes(); //[-28, -72, -83, -27, -101, -67]
//byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
// byte[] bys = s.getBytes("UTF-8"); //[-28, -72, -83, -27, -101, -67]
byte[] bys = s.getBytes("GBK"); //[-42, -48, -71, -6]
System.out.println(Arrays.toString(bys));
//String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
// String ss = new String(bys);
//String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String
// String ss = new String(bys,"UTF-8");
String ss = new String(bys,"GBK");
System.out.println(ss);
}
}
2.字符转换流
转换流输出流 OutputStreamWriter
OutputStreamWriter:是从字符流到字节流的桥梁
是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out, String charsetName)
创建一个使用默认字符编码的OutputStreamWriter。
char数组
void |
close() 关闭流,先刷新。 |
void |
flush() 刷新流。 |
package com.itheima_02;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/*
构造方法:
OutputStreamWriter(OutputStream out):创建一个使用默认字符编码的OutputStreamWriter
写数据的5种方式:
void write(int c):写一个字符
void write(char[] cbuf):写入一个字符数组
void write(char[] cbuf, int off, int len):写入字符数组的一部分
void write(String str):写一个字符串
void write(String str, int off, int len):写一个字符串的一部分
*/
public class OutputStreamWriterDemo {
public static void main(String[] args) throws IOException {
//OutputStreamWriter(OutputStream out):创建一个使用默认字符编码的OutputStreamWriter
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt"));
//void write(int c):写一个字符
// osw.write(97);
// //void flush():刷新流
// osw.flush();
// osw.write(98);
// osw.flush();
// osw.write(99);
//void write(char[] cbuf):写入一个字符数组
char[] chs = {'a', 'b', 'c', 'd', 'e'};
// osw.write(chs);
//void write(char[] cbuf, int off, int len):写入字符数组的一部分
// osw.write(chs, 0, chs.length);
// osw.write(chs, 1, 3);
//void write(String str):写一个字符串
// osw.write("abcde");
//void write(String str, int off, int len):写一个字符串的一部分
// osw.write("abcde", 0, "abcde".length());
osw.write("abcde", 1, 3);
//释放资源
osw.close();
//Exception in thread "main" java.io.IOException: Stream closed
// osw.write(100);
}
}
转换流输入流InputStreamReader
InputStreamReader:是从字节流到字符流的桥梁它读取字节,并使用指定的编码将其解码为字符
创建一个使用命名字符集的InputStreamReader。
InputStreamReader(InputStream in)
创建一个使用默认字符集的InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
package com.itheima_02;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/*
构造方法:
InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader
读数据的2种方式:
int read():一次读一个字符数据
int read(char[] cbuf):一次读一个字符数组数据
*/
public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
//InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader
// InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\osw.txt"));
InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\ConversionStreamDemo.java"));
//int read():一次读一个字符数据
// int ch;
// while ((ch=isr.read())!=-1) {
// System.out.print((char)ch);
// }
//int read(char[] cbuf):一次读一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len = isr.read(chs)) != -1) {
System.out.print(new String(chs, 0, len));
}
//释放资源
isr.close();
}
}
3.综合使用
package com.itheima_03;
import java.io.*;
/*
需求:
把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java
思路:
1:根据数据源创建字符输入流对象
2:根据目的地创建字符输出流对象
3:读写数据,复制文件
4:释放资源
*/
public class CopyJavaDemo01 {
public static void main(String[] args) throws IOException {
//根据数据源创建字符输入流对象
InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\ConversionStreamDemo.java"));
//根据目的地创建字符输出流对象
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\Copy.java"));
//读写数据,复制文件
//一次读写一个字符数据
// int ch;
// while ((ch=isr.read())!=-1) {
// osw.write(ch);
// }
//一次读写一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len=isr.read(chs))!=-1) {
osw.write(chs,0,len);
}
//释放资源
osw.close();
isr.close();
}
}
4. FileReader转换流 和FileWriter转换流 (比上面书写更简洁) 但不能更改编码方式
package com.itheima_03;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
需求:
把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java
数据源和目的地的分析
数据源:myCharStream\\ConversionStreamDemo.java --- 读数据 --- Reader --- InputStreamReader --- FileReader
目的地: myCharStream\\ Copy.java --- 写数据 --- Writer --- OutputStreamWriter --- FileWriter
思路:
1:根据数据源创建字符输入流对象
2:根据目的地创建字符输出流对象
3:读写数据,复制文件
4:释放资源
*/
public class CopyJavaDemo02 {
public static void main(String[] args) throws IOException {
//根据数据源创建字符输入流对象
FileReader fr = new FileReader("myCharStream\\ConversionStreamDemo.java");
//根据目的地创建字符输出流对象
FileWriter fw = new FileWriter("myCharStream\\Copy.java");
//读写数据,复制文件
// int ch;
// while ((ch=fr.read())!=-1) {
// fw.write(ch);
// }
char[] chs = new char[1024];
int len;
while ((len=fr.read(chs))!=-1) {
fw.write(chs,0,len);
}
//释放资源
fw.close();
fr.close();
}
}
字符缓冲流
方式一、按字节数组读
package com.itheima_04;
import java.io.*;
/*
需求:
把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java
思路:
1:根据数据源创建字符缓冲输入流对象
2:根据目的地创建字符缓冲输出流对象
3:读写数据,复制文件
4:释放资源
*/
public class CopyJavaDemo01 {
public static void main(String[] args) throws IOException {
//根据数据源创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java"));
//根据目的地创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java"));
//读写数据,复制文件
//一次读写一个字符数据
// int ch;
// while ((ch=br.read())!=-1) {
// bw.write(ch);
// }
//一次读写一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len=br.read(chs))!=-1) {
bw.write(chs,0,len);
}
//释放资源
bw.close();
br.close();
}
}
方式二、按行读
package com.itheima_04;
import java.io.*;
/*
需求:
把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java
思路:
1:根据数据源创建字符缓冲输入流对象
2:根据目的地创建字符缓冲输出流对象
3:读写数据,复制文件
使用字符缓冲流特有功能实现
4:释放资源
*/
public class CopyJavaDemo02 {
public static void main(String[] args) throws IOException {
//根据数据源创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java"));
//根据目的地创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java"));
//读写数据,复制文件
//使用字符缓冲流特有功能实现
String line;
while ((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
br.close();
}
}