我的博客: https://huangguangda.cn/ https://huangguangda.github.io/ 前言: 編碼解碼:編碼時將信息從一種形式變成為另一種形式,成為編碼.編碼為 ,逆過程為解碼.編碼時用代碼表示的,解碼為 ,有了編碼就有相關的編碼表,是對生活中的文件和電腦進 ...
我的博客:
https://huangguangda.cn/
https://huangguangda.github.io/
前言:
編碼解碼:編碼時將信息從一種形式變成為另一種形式,成為編碼.編碼為coding
,逆過程為解碼.編碼時用代碼表示的,解碼為Decoding
,有了編碼就有相關的編碼表,是對生活中的文件和電腦進行二進位的對應關係.
ascii,GB2312,unicode,UTF-8
把文字進行轉變為二進位位編碼,把二進位轉變為文字為解碼.
把字元串轉變為位元組數組為編碼,把位元組數組轉變為字元串為解碼.字元串的表示為:string
,而位元組數組的表現形式為byte[]
,
string
-->byte[]
: 字元串變字元數組,使用getBytes()
方法,位元組數組變字元串,使用new String((byte[]))
方法.
java.lang
類string
java.lang.object
->java.lang.string
實現的介面:
serializable
,charsequence
,comparable<string>
public final class String extends Object
implements Serializable, Comparable<String>, CharSequence
String
代表字元串,字元串是常量,字元串的值在創建之後就不能更改,只有字元串緩衝區可以支持可變的字元串.
string
對象是不可以變的,但是可以共用.
String str = "abc";
=
char data[] = ['a', 'b', 'c'];
String str = new String(data)
String
類的方法可以用來查詢單個字元,進行比較字元串,提取字元串等等.字元串的串聯可以通過StringBuilder
或StringBuffer
的類來實現.而字元串的轉換可以通過toString
的方法來實現.
String
類表示字元串類型,表示一個UTF-16
格式的字元串.
import java.io.UnsupportedEncodingException;
public class EnDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "abc";
byte[] buf1 = str.getBytes("utf-8");
String s1 = new String(buf1,"utf-8");
System.out.println(s1);
}
}
實例:
public class CutStringTest {
public static void main(String[] args){
String str = "你好aa,謝謝";
byte[] buf = str.getBytes("GBK");
for (int i = 0; i < buf.length; i++) {
String s = cutString(str,i+1);
System.out.println(str+",截取"+(i+1)+"個結果是:"+s);
}
int len = 5;
String s = cutString(str,len);
System.out.println(s);
}
public static String cutString(String str,int len) throws UnsupportedEncodingException {
// 中文由兩個位元組組成
// 將字元串編碼成位元組數組
byte[] buf = str.getBytes("GBK");
int count = 0;
// 對數組進行遍歷, 從截取位置開始往回遍歷
for(int i = len -1; i >= 0; i--){
// 判斷最後的截取位是否是負數
if(buf[i]<0){
count++;
}else{
break;
}
}
// 判斷奇偶數
if(count%2==0){
return new String(buf, 0, len);
}else{
return new String(buf,0,len-1);
// 捨棄最後一個。
}
return null;
}
}
聯通:
移動:
public class Test {
public static void main(String[] args) {
String str = "聯通";
byte[] buf = str.getBytes();
// 二進位
for(byte b : buf){
System.out.println(Integer.toBinaryString(b&255));
}
}
}
字元流的緩衝區
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
BufferedReader bufr = new BufferedReader(new FileReader("Test.java"));
String line = null;
while((line=bufr.readLine())!=null){
System.out.println(line);
}
bufr.close();
}
}
readLine和緩衝區
BufferedReader();字元數組 fr.read(char[]);
FileReader(); read()字元
readLine(); 一次讀取一行
readLine():
調用緩衝區的read方法,是將讀取到的字元存儲到另一個容器,當讀取到終止符時,就將臨時容器中存儲的數據轉換為字元串返回.
緩衝區:
使用底層流對象從具體設備上獲取數據,並將存儲到緩衝區中的數據內,通過緩衝區中read()方法,可以從緩衝區中獲取具體的字元數據,可以提高效率,如果用read()方法讀取字元數據,並存儲到另一個容器中,直到讀取到了換行符,這時另一個容器的臨時存儲的數據就會換成字元串返回,就會形成readLine()的功能.
實例:
自定義一個字元流緩衝區,用來緩衝字元數據,從而提高效率,可以使用緩衝區數據的方法.
緩衝區應該具備什麼?
1,要有數組。
2,對數組進行操作,對數組操作一定要有角標。
public class MyBufferedReader {
private Reader r;
// 定義一個字元數組,作為緩衝區。
private char[] buf = new char[1024];
// 定義了一個索引,用於操作數組中的元素。
private int index = 0;
// 定義了一個變數,用於記錄讀取字元的個數。
private int count = 0;
// 需要一初始化就具備一個流對象。
public MyBufferedReader(Reader r) {// 可以對Reader的所有子類進行高效讀取。
this.r = r;
}
public int read() throws IOException {
/*
* 1,需要先通過流對象從底層設備上獲取一定數據的數據到緩衝區數組中。 使用流對象read(char[]);
*/
//如果count記錄字元個數的變數為0,說明緩衝區已經沒有字元數據。
if(count==0){
//需要從設備上獲取一定數量的數據存儲到緩衝區中,並用count記錄存儲字元的個數。
count = r.read(buf);
//每取一次新的數據,就需要將角標歸0.
index = 0;
}
//如果count小於0,說明到-1,沒有數據了,程式直接返回-1.
if(count<0){
return -1;
}
//從緩衝區中取出一個字元。
char ch = buf[index];
//角標自增。
index ++;
//計數器要自減。
count --;
return ch;
}
public String readLine() throws IOException{
//1,定義一個臨時容器。
StringBuilder sb = new StringBuilder();
//2,調用本類中的read方法,從緩衝區中讀取一個字元,存儲到臨時容器中。
//存的時候要註意:必須判斷,如果是行終止符就不要存儲了。就將臨時容器中的
//字元轉成字元串返回。
int ch = 0;
while((ch=this.read())!=-1){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return sb.toString();
}
sb.append((char)ch);//將讀取到的字元數字轉成char類型,存儲到sb中。
}
//萬一文本中最後以後沒有行終止符,判斷一下sb中是否有內容,如果有則返回。
if(sb.length()!=0){
return sb.toString();
}
return null;
}
// 關閉流資源。
public void close() throws IOException {
// 其實內部就是關閉具體的流。
r.close();
}
}
public class MyBufferedReaderDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// 驗證自定義的緩衝區。
MyBufferedReader myBufr = new MyBufferedReader(new FileReader("dashucoding\\1.txt"));
String line = null;
while((line=myBufr.readLine())!=null){
System.out.println(line);
}
myBufr.close();
}
}
位元組流:
FileInputStream FileOutputStream
BufferedInputStream BufferedOutputStream
字元流:
FileReader FileWriter
InputStreamReader OutputStreamWriter
BufferedReader BufferedWriter
public class ReadDemo {
public static void main(String[] args) throws IOException {
/*
* 思路:
* 將數據存儲到的文件
* 怎麼獲取數據來源呢?鍵盤錄入怎麼弄呢?
* 鍵盤錄入是輸入
* 在System類找到了標準輸入流
* System.in 對應的類型是InputStream。位元組輸入流。
*/
//獲取了鍵盤錄入的輸入流對象。可以不用關閉。
InputStream in = System.in;
int ch = in.read();
System.out.println(ch);
int ch1 = in.read();
System.out.println(ch1);
int ch2 = in.read();
System.out.println(ch2);
int ch3 = in.read();
System.out.println(ch3);
}
}
讀取的:
此抽象類表示位元組輸入流的所有類的超類
位元組輸入流轉成字元輸入流
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
public class DataToFileTest {
public static void main(String[] args) throws IOException {
//鍵盤錄入。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//目的是文件。
// FileWriter fw = new FileWriter("dashucoding\\key.txt");
// BufferedWriter bufw = new BufferedWriter(fw);
BufferedWriter bufw = new BufferedWriter(new FileWriter("dashucoding\\key.txt"));
String line = null;
while((line=bufr.readLine())!=null){
if("over".equals(line)){
break;
}
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
IO流
操作的數據是數據源還是數據
源: InputStream Reader
目的: OutputStream Writer
要操作的設備是位元組還是文本
源: 位元組:InputSteam 文本:Reader
目的: 位元組:OutputSteam 文本:Writer
具體設備:
源設備: 硬碟:文件File,記憶體:數組,字元串,鍵盤:System.in,網路:Socket
目的設備: 硬碟:文件File,記憶體:數組,字元串,屏幕:System.out,網路:Socket
需求
源:字元串,目的:文件, OutputStream, Writer
FileWriter fw = new FileWriter("a.txt");
fw.write(string);
高效
BufferedWriter bw= new BufferedWriter(new FilewWriter("a.txt"));
bw.write(string);
bw.newLine();
bw.flush();
複製文本文件
源:InputStream Reader
目的:OutStream Writer
(可有過濾需求)
FileInputStream fis = new FileInputStream("a.txt");
FileOutputStream fos = new FileOutputStream("b.txt");
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
高效
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
String line = br.readLine();
line = line.replace("dashucoding","達叔小生");
bw.write(line);
讀取鍵盤錄入到文件中(一般都是文本)
源: InputStream Reader
目的: OutputStream Writer
InputStream in = System.in;
FileWriter fw = new FileWriter("a.txt");
byte[] buf = new byte[1024];
int len = in.read(buf);
String str = new String(buf,0,len);
fw.write(str);
位元組轉字元 InputStreamReader
InputStreamReader isr=new InputStreamReader(System.in);
FileWriter fw = new FileWriter("a.txt");
高效
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt");
讀取文件到屏幕
FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;
System.out.println();
讀取文件到文本數據,將數據按照utf-8存儲到文件中
FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("b.txt");
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8"));
達叔小生:往後餘生,唯獨有你
You and me, we are family !
90後帥氣小伙,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: 達叔小生
https://www.jianshu.com/u/c785ece603d1
結語
- 下麵我將繼續對 其他知識 深入講解 ,有興趣可以繼續關註
- 小禮物走一走 or 點贊