Trabalhando com a classe File

10 respostas
J

Ola galera !!
Estou trabalhando com a classe File porem sou um pouco noob ainda… gostaria da ajuda de vcs com a seguinte situação…
eu tenho um diretorio(pasta)e la dentro contem arquivos… meu método acessa essa pasta e lista informações sobre esses arquivos
o problema que eu tenho que trazer caracteristicas desses arquivos por exemplo: nome ,tamanho,codigo…
consegui até agora trazer o nome pois é o mais intuitivo, porem os outros 4 parametros que necessito trazer estou em duvida de como fazer…
um deles é do tipo data esse nao consigo faze-lo de modo que nao de erro.

Segue o meu código:

private FT00ResponseVO buildResponse(String source) throws HandleException {
				
		FT00ResponseVO responseVO = new FT00ResponseVO();
		responseVO.setCodigoRetorno(0);

		try {
			LocalFileUtil fileUtil = new LocalFileUtil(source);
			List<File> files = fileUtil.getFiles("");

			byte[] buf = new byte[1024];
			int len = 0;
			
			log.info("Generating FT00 response object");

			for (File file: files) {
				
				InputStream in = null;
				ByteArrayOutputStream out = null;
				
				try {
					in = new FileInputStream(file);
					out = new ByteArrayOutputStream(); 
					
					while ((len = in.read(buf)) > 0){
						out.write(buf, 0, len);
					}
					out.flush();
					
					FT00ArquivoVO arquivoVO = new FT00ArquivoVO();
					arquivoVO.setNomeArquivo(file.getName());     //AKI ESTA CORRETO
					arquivoVO.setCodigoProduto(file.getPath());     //NAO DA ERRO POREM NAO SEI SE FUNCIONA
					arquivoVO.setTamanho(new String(Base64.encode(out.toByteArray())));   //SE NAO ME ENGANO ESSE TRAZ O CONTEUDO.(NECESSITO QUE ELE TRAGA O TAMANHO NAO O CONTEUDO)
					arquivoVO.setTimestampArquivo( Date(file.getPath()));// NAO FUNCIONA NAO SEI COMO IMPLEMENTAR
					arquivoVO.setTipoCaixaPostal(file.getPath());             // NAO DA ERRO POREM NAO SEI COMO IMPLEMENTAR...
		
					responseVO.addAllArquivos((List) arquivoVO);
	
				} catch (Exception e) {
					log.warn("Fail to include file " + file.getName() + " in responseVO", e);
				} finally {
					try {
						if (in != null) {
							in.close();
						}
						if (out != null) {
							out.close();
						}
					} catch (IOException e) {
						log.warn("Fail to close streams for file " + file.getName(), e);
					}
				}
			}
		} catch (IntegLayerException e) {
			throw new HandleException(IntegLayerErrorCodes.ERROR_BUILDING_RESPONSE, e);
		}
		
		return responseVO;
	}

galera espero ter sido claro vlw abração

10 Respostas

K

cara… todos seus problemas seriam resolvidos se você tivesse procurado o javadoc da classe File… la tem tudo que você ta procurando… dê uma olhada nos métodos aí

http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html

abraço!

J

pois é brother ja fiz isso… porem nao consegui compreender muito bem os metodos… se algm pudesse me ajudar com quais metodos seriam para cada parametro… fiquei um pouco confuso…abraços

A

A partir disso cheguei no seguinte código:

File file = new File("path");
System.out.println("Path: " + file.getAbsolutePath());
System.out.println("Last modification date: " + new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date(file.lastModified())));
System.out.println("Size: " + file.length() + " bytes");

[Editado]
kritiuns, não vi que você tinha respondido. Me desculpe.

juliocesarrosa, se você quer ser um bom desenvolvedor, sugiro começar a entender o JavaDoc. Não é difícil, é só entender inglês e ler com atenção.

J

Galera nao estou entendendo uma coisa…

arquivoVO.setNomeArquivo(file.getName());//OK
					arquivoVO.setCodigoProduto(file.getAbsolutePath()) //OK;
	       		        	arquivoVO.setTamanho(new Long(file.length()).toString());//OK

				
					arquivoVO.setTimestampArquivo( new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date(file.lastModified())));//ESSE CARA JA EH DO TIPO DATE E ELE FICA ACUSANDO ERRO NO setTimestampArquivo FALANDO QUE ESTOU PASSANDO STRING , MAS ESTOU PASSANDO DATE E ELE EH DO TIPO DATE ALGM SABE O QUE PODE SER???
					arquivoVO.setTipoCaixaPostal(file.getPath());

Desculpem algumas duvidas bem bestas pois sou iniciante ainda… obrigado

R

então cara… quando você faz isso

arquivoVO.setTimestampArquivo( new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date(file.lastModified())));

se a propriedade timestampArquivo for data ele realmente vai acusar isso, porque o método format() do SimpleDateFormat retorna uma string, e não um Date como você esperava, se quiser um Date direto faça assim:

arquivoVO.setTimestampArquivo(new Date(file.lastModified()));
J

Vlw galera essa parte esta certa ja…
ele verifica o que tem no caminho especificado… pega os arquivos e tras o que é pedido como tamanho dos arquivos,nome e etc…

o que preciso agora é que ele busque nesse diretorio um arquivo de acordo com o especificado, ou seja que ele busque um arquivo especifico que vira
especificado.

ex:usuario escolheu CC=Conta corrente… preciso que ele busque arquivos com o nome/prefixo CC… utilizando aquele mesmo codigo soh que agora ao invés de ser
todos os arquivos como fazia antes preciso que ele pegue apenas os que serão especificados.

private FT00ResponseVO buildResponse(String source) throws HandleException {
		
		FT00ResponseVO responseVO = new FT00ResponseVO();
		FT00ArquivoVO arquivoVO = new FT00ArquivoVO();
		FT00RequestVO requestVO = new FT00RequestVO();
		
		responseVO.setCodigoRetorno(0);

		try {
			LocalFileUtil fileUtil = new LocalFileUtil(source);
			List<File> files = fileUtil.getFiles("");

			byte[] buf = new byte[1024];
			int len = 0;
			String armazena = requestVO.getCodigoProduto();
			
			log.info("Generating FT00 response object");

			for (File file: files) {
				
				InputStream in = null;
				ByteArrayOutputStream out = null;
				
				try {
					in = new FileInputStream(file);
					out = new ByteArrayOutputStream(); 
					
					while ((len = in.read(buf)) > 0){ // le todos os arquivos do direitorio,pensei em emplementar algo aki pois ai ele só iria ler o que realmente interessa e nao tudo.. ma nao sei como fazer..				
					}
						out.write(buf, 0, len);			
					}
					out.flush();
					
					 file.list().equals(requestVO.getCodigoProduto());  //Gostaria de saber se isso funciona??? ele vai me trazer apenas os arquivos que são iguais a Codigo produto???Se não, como faço para trazer de Dentro de file apenas os arquivos que Tenham o prefixo que virá em Codigo produto
					
					
					arquivoVO.setNomeArquivo(file.getName().equals(requestVO.getCodigoProduto())); //Tentei fazer assim pegando o nome dos arquivos da e depois forçando os a compara-los com o que virá em Codigo Produto.. nao sei se funciona...
					
					arquivoVO.setNomeArquivo(file.getName());
					arquivoVO.setCodigoProduto(file.getAbsolutePath());
	       			        arquivoVO.setTamanho(new Long(file.length()).toString());
				 	arquivoVO.setTimestampArquivo(new Date(file.lastModified()));
					arquivoVO.setTipoCaixaPostal(file.getPath());
					
				     responseVO.addAllArquivos((List) arquivoVO);
			
				} catch (Exception e) {
					log.warn("Fail to include file " + file.getName() + " in responseVO", e);
				} finally {
					try {
						if (in != null) {
							in.close();
						}
						if (out != null) {
							out.close();
						}
					} catch (IOException e) {
						log.warn("Fail to close streams for file " + file.getName(), e);
					}
				}
			}
		} catch (IntegLayerException e) {
			throw new HandleException(IntegLayerErrorCodes.ERROR_BUILDING_RESPONSE, e);
		}
		
		return responseVO;
	}

Desculpe as duvidas um pouco primarias sou novo na area... obrigado
R

você pode perguntar pelo nome

se for pelo início… igual você exemplificou, a classe String tem métodos que ajudam bastante

pesquise por String.startsWith();

ele testa o começo da string e vê se é igual ao que você quer

J

Vc poderia me dar um exemplo de como ficaria essa verificação… quanto a sinxate mesmo…
meu fraco é trasnpor em sintaxe… mas li a respeito do método vi que ele testa a sequencia do prefixo… é exatamente o que preciso.

R

depois do seu flush ali e antes das atribuições… delete aquele equals… e coloque uma linha assim

if(file.getName().startsWith(requestVO.getCodigoProduto())){
K

Jovem,

Lembrando que a classe File permite você criar e manipular arquivos, mas não permite que você acesse ou edite o conteudo do mesmo.

Abs,

Criado 18 de maio de 2011
Ultima resposta 20 de mai. de 2011
Respostas 10
Participantes 5