Como entender o fluxo de E/S em Java - simplificando

Índice

introdução

fluxo em buffer 

fluxo de buffer de bytes 

fluxo de buffer de caracteres 

transformar fluxo 

fluxo de conversão de entrada de caracteres 

fluxo de conversão de saída de caracteres 

Serializar e desserializar 

serialização de objetos 

Desserialização de objetos 

fluxo de impressão 

Propriedades


 

introdução

Através do estudo simples anterior, conseguimos ter uma compreensão geral do funcionamento do arquivo, mas podemos sentir claramente que ainda existem alguns inconvenientes ao realizar outras operações, então hoje vamos aprender mais quatro fluxos de IO Para nos ajudar operam em arquivos, esses quatro fluxos são fluxo de buffer , fluxo de conversão , serialização e fluxo de impressão . Bem, sem mais delongas, deixe-me começar o estudo de hoje!

 

 

fluxo em buffer 

  • O streaming em buffer também é conhecido como streaming eficiente ou streaming avançado. O fluxo de bytes aprendido anteriormente também pode ser chamado de fluxo bruto.
  • Função: O fluxo de buffer tem seu próprio buffer, que pode melhorar o desempenho da leitura de dados do fluxo de bytes original e do fluxo de caracteres.
  • Exemplo de imagem : Se imaginarmos as operações de entrada e saída do arquivo como o processo de transporte de água, no início, a água (dados) é transportada diretamente para a tubulação de água, e a diferença entre o fluxo de buffer é que a água não não precisa ser conectado ao cano de água. , ele só precisa ser encaixado no tanque de água na frente do cano de água, o que pode melhorar a eficiência do transporte.
  • Existem dois tipos de fluxos de buffer, um é o fluxo de buffer de bytes e o outro é o fluxo de buffer de caracteres. Eles são BufferedInputStream (fluxo de entrada com buffer de byte) , BufferedOuputStream (fluxo de saída com buffer de byte) , BufferedReader (fluxo de entrada com buffer de caractere) , BufferedWriter (fluxo de saída com buffer de caractere). 

fluxo de buffer de bytes 

  • Fluxo de entrada com buffer de byte : BufferedInputStream, melhora o desempenho da leitura de dados do fluxo de entrada de byte e as funções de leitura e gravação não foram alteradas
  • Fluxo de saída com buffer de byte : BufferedOutputStream, melhora o desempenho da leitura de dados do fluxo de saída de byte e não há alteração nas funções de leitura e gravação
Construtor ilustrar

public BufferedInputStream(InputStream é)

O fluxo de entrada de bytes de baixo nível pode ser encapsulado em um pipeline de fluxo de entrada com buffer de bytes de alto nível, melhorando assim o desempenho da leitura de dados do fluxo de entrada de bytes
public BufferedOutputStream(OutputStream os) O fluxo de saída de bytes de baixo nível pode ser encapsulado em um pipeline de fluxo de saída com buffer de bytes de alto nível, melhorando assim o desempenho da gravação de dados
InputStream is = new FileInputStream("File//data.txt");
InputStream bis = new BufferedInputStream(is);
OutputStream os = new FileOutputStream("File//data01.txt");
OutputStream bos = new BufferedOutputStream(os);
int len;
byte []buffer = new byte[1024];
while ((len = bis.read(buffer))!=-1){
bos.write(buffer,0,len);
bos.flush();

Copia o conteúdo de um arquivo em outro por meio de um fluxo de buffer de bytes.

 

fluxo de buffer de caracteres 

Fluxo de entrada com buffer de caracteres : BufferedReader, que melhora o desempenho dos dados de leitura do fluxo de entrada de caracteres, além da função de leitura de dados por linha

Construtor ilustrar
público BufferedReader(Reader r) O fluxo de entrada de caracteres de baixo nível pode ser encapsulado em um pipeline de fluxo de entrada de caracteres em buffer de alto nível, melhorando assim o desempenho da leitura de dados do fluxo de entrada de caracteres
método ilustrar
String pública readLine() Ler uma linha de dados e retornar, se a leitura não for concluída, não há linha para ler e retornar null
        Reader r = new FileReader("File//data.txt");
        BufferedReader br = new BufferedReader(r);//由于是子类独有的功能,所有不能使用多态创建
        String s;
        byte []buffer = new byte[1024];
        while ((s = br.readLine())!=null){
            System.out.println(s);
        }
//正常情况下会将文件中的数据依次输出;
        Reader r = new FileReader("File//data.txt");
        BufferedReader br = new BufferedReader(r);
        br.readLine();
        br.readLine();
//若文件中的数据不足两行:
//kdirvingJamesJame
//null

Fluxo de saída com buffer de caracteres : BufferedWriter, que melhora o desempenho dos dados de gravação do fluxo de saída de caracteres, além da função de nova linha 

Construtor ilustrar
Public BufferedWriter(Writer w) O fluxo de saída de caracteres de baixo nível pode ser empacotado em um pipeline de fluxo de saída de caracteres em buffer de alto nível, melhorando assim o desempenho da gravação de dados no fluxo de saída de caracteres
método ilustrar
public void novaLinha() executar a ação
        Writer w = new FileWriter("File//data.txt",true);
        BufferedWriter bw = new BufferedWriter(w);//由于是子类独有的功能,所有不能使用多态创建
        bw.write("石原里美");
        bw.newLine();
        bw.write("工藤静香");
        bw.newLine();
        bw.flush();

Deve-se notar que se você quiser anexar o arquivo ao escrever o arquivo, você precisa definir true para o objeto Writer, não para o objeto BufferedWriter.

 

transformar fluxo 

Antes de aprender sobre fluxos de conversão, o que devemos entender é se a codificação do código e a codificação do arquivo são inconsistentes. Usar o fluxo de caracteres para ler diretamente causará caracteres ilegíveis, portanto, precisamos que a codificação do código e a codificação do arquivo sejam consistentes para garantir que não haja caracteres ilegíveis, e a aparência do fluxo de conversão é para evitar que esse tipo de coisa aconteça . 

 

fluxo de conversão de entrada de caracteres 

A primeira é fornecer uma ideia simples para o problema de caracteres ilegíveis:

1. Use a entrada de caracteres para converter fluxos;

2. O fluxo de bytes original do arquivo (codificação diferente) pode ser extraído e não haverá problema com o byte original;

3. Converta o fluxo de bytes no fluxo de entrada de caracteres com a codificação especificada, para que os caracteres no fluxo de entrada de caracteres não sejam distorcidos.

Fluxo de conversão de entrada de caracteres: InputStreamReader, que pode converter o fluxo de bytes original em um fluxo de entrada de caracteres de acordo com a codificação especificada

Construtor ilustrar
público InputStreamReader(InputStream é) O fluxo de bytes original pode ser convertido em um fluxo de entrada de caracteres de acordo com a codificação padrão do código. quase nunca
public InputStreamReader(InputStream é,String charset) O fluxo de bytes original pode ser convertido em um fluxo de entrada de caracteres de acordo com a codificação especificada, para que os caracteres no fluxo de caracteres não sejam distorcidos

        InputStream is = new FileInputStream("File//data.txt");
        InputStreamReader isr = new InputStreamReader(is);
        InputStreamReader isr = new InputStreamReader(is,"GBK");

No código acima, sabe-se que o formato de codificação do arquivo data.txt está configurado para GBK, e a codificação do código é utf-8, portanto é necessário converter o stream para tornar a codificação consistente. Um construtor padroniza para utf-8, o que obviamente não é aceitável.O segundo é especificar a codificação, converter o fluxo de entrada de bytes original em um fluxo de entrada de caracteres e lê-lo na forma de GBK.

fluxo de conversão de saída de caracteres 

Fluxo de conversão de saída de caracteres: OutputStreamWriter, que pode converter o fluxo de saída de bytes em um fluxo de saída de caracteres de acordo com a codificação especificada

Construtor ilustrar
public OutputStreamWriter(OutputStream os) O fluxo de saída de bytes original pode ser convertido em um fluxo de saída de caracteres de acordo com a codificação padrão do código, quase sem uso
public OutputStreamWriter(OutputStream os,String charset) Ele pode converter o fluxo de saída de bytes original em um fluxo de saída de caracteres de acordo com a codificação especificada

Em primeiro lugar, devemos saber para que coisas do mundo real serve o fluxo de conversão de saída de caracteres. Neste momento, precisamos passar um arquivo codificado como GBK.

        OutputStream os = new FileOutputStream("File//data.txt");
        Writer osw = new OutputStreamWriter(os);
        Writer osw = new OutputStreamWriter(os,"GBK");

No código acima, o primeiro é o padrão utf-8, portanto, é quase inútil, e o segundo é especificar o formato do arquivo de codificação exigido pelo cliente.

 

Serializar e desserializar 

serialização de objetos 

  • Fluxo de saída de byte de objeto , ObjectOutputStream
  • Função: Com base na memória, armazena objetos na memória em arquivos de disco, o que é chamado de serialização de objetos
Construtor ilustrar
public ObjectOutputStream(OutputStream os) Envolva o fluxo de saída de bytes de baixo nível em um fluxo de saída de bytes de objeto de alto nível

 A primeira é simplesmente criar uma classe de aluno Student.Deve-se notar que quando Java especifica a serialização de objetos, a classe precisa implementar a interface Serializable .

public class Student implements Serializable {
    private String name;
    private int age;
    private String number;
    private String classroom;
}

O próximo passo é implementar a serialização do objeto:

        Student s = new Student("石原里美",18,"001","智能一班");
        OutputStream os = new FileOutputStream("File//data.txt");
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(s);
        oos.close();

Além disso, se você não quiser que alguns dados do objeto não participem da serialização, você pode modificá-lo por transient , como "private transient String name". Após realizar esta operação, os dados serão exibidos nulos quando forem desserializados. .

Desserialização de objetos 

  • Fluxo de entrada de bytes de objeto, ObjectInputStream
  • Função: Com base na memória, restaura dados de objetos armazenados em arquivos de disco em objetos na memória, o que é chamado de desserialização de objetos
Construtor ilustrar
public ObjectInputStream(InputStream é) envolve um fluxo de entrada de bytes de baixo nível em um fluxo de entrada de bytes de objeto de alto nível
nome do método ilustrar
objeto público readObject() Restaure os dados do objeto armazenados no arquivo em disco para o objeto na memória e retorne
        InputStream is = new FileInputStream("File//data.txt");
        ObjectInputStream ois = new ObjectInputStream(is);
        Object s = ois.readObject();
        System.out.println(s);
//输出结果:
//Student{name='石原里美', age=18, number='001', classroom='智能一班'}

Além disso, há outro ponto de conhecimento. Ao definir uma classe, você pode definir um número de série de versão e, ao desserializar o número de série, o número de série deve ser consistente antes de poder ser lido normalmente, como "private static final long serialVersionUID = 1; "

Se o número de série da versão na classe for alterado após a primeira serialização, a desserialização relatará um erro antes da segunda reserialização.

 

fluxo de impressão 

  • Função: O fluxo de impressão pode realizar dados de impressão convenientes e eficientes para o arquivo. Geralmente se refere a PrintStream, WriteStream duas classes
  • Quais dados podem ser impressos são quais dados, por exemplo, imprimir o inteiro 97, escrever é 97, imprimir boolean true, escrever é true
Construtor ilustrar
public PrintStream(OutputStream os) O fluxo de impressão vai diretamente para o tubo de fluxo de saída de byte
Público PrintStream(Arquivo f) O fluxo de impressão vai diretamente para o objeto de arquivo
public PrintStream(Caminho de arquivo de string) O fluxo de impressão vai diretamente para o caminho do arquivo
nome do método ilustrar
impressão de vazio público (Xxx xx) imprimir qualquer tipo de dados

//三种构造器的使用
PrintStream ps = new PrintStream("File//data01.txt");
PrintStream ps1 = new PrintStream(new File("File//data.txt"));
PrintStream ps2 = new PrintStream(new FileOutputStream(new          File("File//data.txt")));
ps.print(11);
ps.print("凯里·欧文");

A diferença entre PrintStream e WriterStream :

  • A função de impressão de dados é exatamente a mesma, fácil de usar e eficiente em desempenho.
  • PrintStream herda o fluxo de saída de byte OutputStream e suporta métodos para escrever dados de byte
  • PrintWriter herda o fluxo de saída de caracteres Writer e suporta a escrita de caracteres

Propriedades

  • Função: Propriedades representa um arquivo de propriedades que pode armazenar as informações do par chave-valor em seu próprio objeto em um arquivo de propriedades
  • Arquivo de propriedades: O sufixo é um arquivo que termina com .properties, e o conteúdo nele é key=value, que será usado para informações de configuração do sistema posteriormente.

Construtor ilustrar
carga nula (InputStream é) Ler uma lista de atributos (pares chave-valor) do fluxo de bytes de entrada
carga vazia (Reader r) Ler uma lista de atributos (pares chave-valor) do fluxo de caracteres de entrada
void store (OutputStream os,Comentários de string) Escreva esta lista de propriedades (pares chave-valor) nestas Propriedades para gerar um fluxo de bytes em um formato adequado para usar o método load(InputStream)
void store(Writer w,String comments) Grava esta lista de propriedades (pares chave-valor) nestas Propriedades para gerar um fluxo de caracteres em um formato adequado para usar o método load(reader)
Public Object setProperty(Chave de string,Valor de string) Salvar par de valores-chave (put)
public String getProperty(String key) 使用此属性列表中指定的键搜索属性值(get)
public Set<String> stringPropertyNames() 所有键的名称的集合(keySet())
        Properties properties = new Properties();
        properties.setProperty("石原里美","18");
        properties.setProperty("工藤静香","19");
        properties.setProperty("朱茵","20");
        System.out.println(properties);
        //第一个参数是文件存储路径,第二个是对文件的注释
        properties.store(new FileWriter("File//Baby.properties"),"这些都是绝世美女,不接受反驳哈哈哈");

        Properties properties = new Properties();
        properties.load(new FileReader("File//Baby.properties"));
        System.out.println(properties);
//输出结果:
//{"石原里美"=18,"工藤静香"=19,"朱茵"=20}

创作不易,给个三连吧

 

 

 

Acho que você gosta

Origin blog.csdn.net/weixin_50635856/article/details/125633381
Recomendado
Clasificación