21-I / O (fluxo de entrada e saída) - caracteres e bytes

Olá pessoal, eu sou um porco arqueado por repolho.

1. Introdução aos fluxos de entrada e saída

O código que batemos neste estágio geralmente é baseado no console.
Produzimos os dados por System.out - System.out.print (“o destino da saída é a tela”).
A entrada é System.in, que primeiro define um objeto do scanner, verifica os dados inseridos pelo usuário no console
Scan scan = new Scanner ( System.in ); a origem da entrada vem da entrada do usuário
(1) no console Saída de julgamento e fluxo de saída
O julgamento de entrada e saída é baseado no programa
Ler um arquivo - entrada (no programa)
escrever um arquivo - saída (as informações provêm do programa)
(2) ler é entrada, escrever (escrever) ) É a saída.
Imaginamos o código do programa como nosso próprio cérebro. Quando lemos um livro, é um processo de inserção de conhecimento no cérebro. Depois tivemos algumas idéias e escrevemos o que pensávamos em nossas cabeças: é um processo de saída? Tudo é baseado em nosso cérebro, ou seja, no programa.
(3) JDBC, entrada e saída entre o programa e o banco de dados O
Insira a descrição da imagem aqui
fluxo de entrada e o fluxo de saída são dois canais de transmissão de dados, como o canudo quando bebemos uma bebida. Julgamos que a direção do fluxo de entrada e saída é muito simples, ou seja, usando-nos como referência, como quando tomamos chá com leite, é difícil inserir o tubo e fazer um furo. No programa específico, apenas usamos o programa como objeto de referência, inserimos o tubo no banco de dados e, em seguida, obtemos os dados através desse tubo, para que a direção dos fluxos de entrada e saída seja direcionada ao banco de dados. Quando tomamos chá com leite com pérola, ele aparece assim que chupamos a pérola na boca? Os dados são os mesmos. O fluxo da seta verde na figura é o fluxo de dados.
(4) Entrada e saída de arquivo e arquivo
O que falamos anteriormente é a tendência de dados entre o programa e o banco de dados. Queremos copiar os dados de um arquivo para outro, queremos ver se existe um canal entre esse arquivo e o arquivo. Sim, o arquivo anterior é chamado de arquivo de origem e o arquivo a ser gravado nos dados é chamado de destino. Arquivo Há um pequeno orifício entre eles, que permite a saída ou entrada de dados. O arquivo de origem é inserido no pipeline do fluxo de saída e o arquivo de destino é inserido no pipeline do fluxo de entrada. Os dois tubos têm nomes diferentes e são dois tubos independentes. Não pode ser conectado diretamente. Em vez disso, ele usa programas para implementar a interação de dados. Conforme mostrado na figura, a direção do fluxo de entrada e do fluxo de saída é baseada no programa.Pense em como o canudo é inserido.
(5) Os dados nos dois fluxos de entrada e saída comuns
Reader / Writer são transmitidos na forma de caracteres , principalmente
texto.Os dados no InputStream / OutStream são transmitidos na forma de bytes , principalmente hipertexto (como imagens, áudio, etc.) )

2. Vamos falar sobre como gravar os dados no arquivo em outro arquivo

(1) Primeiro, precisamos criar dois arquivos , um é o arquivo de origem e o outro é o arquivo de destino.

	//源
			File 源文件 = new File("d:/test0807/a.txt");
			
			//目标
			File 目标文件 = new File("d:/test0807/x.txt");

( 2) Crie fluxos de entrada, fluxos de saída (dois tubos) e diga a eles onde estão inseridos.

			FileReader 输入流 = new FileReader(源文件);
			
			FileWriter 输出流 = new FileWriter(目标文件);

O FIleReader aqui é um fluxo de entrada, e o parâmetro é dizer a ele onde inserir, ou seja, qual arquivo conectar.
(3) Crie uma área de buffer , salve os dados no programa primeiro e depois grave no arquivo de destino, onde o Reader / Wrieter está na forma de caracteres, portanto, definimos uma matriz de caracteres para armazenar em cache esses dados primeiro. Quanto tempo deve ter a matriz de caracteres? Como na vida real, temos que transportar muita areia do local de produção para o local de construção.Não estamos construindo um táxi que possa ser completamente instalado, mas muitos carros pequenos são transportados em vários lotes. Essa também é a razão do buffer: pensamos na matriz de caracteres como um carrinho e a transportamos para frente e para trás até terminar, portanto deve haver um loop aqui.
Há outra situação que precisamos considerar: se definirmos o comprimento da matriz de caracteres como 5 e o tamanho do arquivo de origem como 13, ele deverá ser transportado três vezes, para que o comprimento do arquivo de destino seja 15. Há um desperdício de espaço para 2 caracteres, a fim de evitar isso? Tipo de desperdício, write () pode nos ajudar a alcançar

			char[] 临时缓冲区 = new char[5];
			
			int len = 0;
			while ((len = 输入流.read(临时缓冲区)) > 0) {
				输出流.write(临时缓冲区, 0, len);
			}
			

Primeiro defina len = 0, use-o para igualar o comprimento dos dados lidos no arquivo de origem, se for maior que 0, e depois grave-o no arquivo de destino, igual a 0 significa que a leitura está concluída. Output stream.write (buffer temporário, 0, len); significa que os dados no buffer são seguidos pelos dados no arquivo de destino e 0 representa o deslocamento, por exemplo, para dizer "Olá pessoal, eu sou um cara bonito" , O primeiro loop é gravado em "Olá pessoal, eu sou", um total de 5 caracteres, se o deslocamento for -1, o conteúdo a seguir é "Olá pessoal, meu rapaz bonito" substituirá "Sim", len representa Escreva o comprimento. Na explicação, a saída stream.write (buffer temporário, 0, len); é gravar os dados do buffer temporário no comprimento de len, de acordo com o deslocamento de 0, de acordo com os 13 mencionados anteriormente, e o comprimento final é 3. Portanto, evite Desperdiçado.
(4) Não se esqueça de fechar o fluxo de entrada e fluxo de saída após a abertura e coloque a tampa quando a bebida acabar.

			输入流.close();
			输出流.close();

Abaixo está o código completo

public static void main(String[] args) {
		try {

			//源
			File 源文件 = new File("d:/test0807/a.txt");
			
			//目标
			File 目标文件 = new File("d:/test0807/x.txt");
			
			FileReader 输入流 = new FileReader(源文件);
			
			FileWriter 输出流 = new FileWriter(目标文件);
			
			/*
			 * 输入流:可以读取源文件中的数据到【程序】中
			 * 输出流:可以把【程序】中的数据,写入到目标文件
			 * */
			
			//创建一个临时存储区域,buffer(缓冲)
			char[] 临时缓冲区 = new char[5];
			
			int len = 0;
			while ((len = 输入流.read(临时缓冲区)) > 0) {
				输出流.write(临时缓冲区, 0, len);
			}
			
			输入流.close();
			输出流.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

A seguir, é apresentado um exemplo de FIleInputStream / FileOutputStream. A
diferença é que um é uma matriz de caracteres e o outro é uma matriz de bytes.

public static void main(String[] args) {
		try {
			File 源文件 = new File("d:/test0807/normal.png");
			
			File 目标 = new File("d:/test0807/target.png");
			
			InputStream 输入流 = new FileInputStream(源文件);
			
			OutputStream 输出流 = new FileOutputStream(目标);
			
			byte[] buffer = new byte[1024];
			
			int len = 0;
			while ((len = 输入流.read(buffer)) > 0) {
				输出流.write(buffer, 0, len);
			}
			
			/*输入流.read(buffer);
			输出流.write(buffer);*/
			
			输入流.close();
			输出流.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
Publicado 24 artigos originais · elogiado 4 · visitas 2038

Acho que você gosta

Origin blog.csdn.net/weixin_44226263/article/details/98881555
Recomendado
Clasificación