我有一些批处理程序应该从目录中获取文件并进行处理.
由于这个程序应该:
... 只从目录中选择一个文件的最佳方法是什么 - 不使用 File.list()(可能是数百个文件)?
我执行此操作时出现编译错误:
RandomAccessFile raf = new RandomAccessFile(...)
InputStream is = (InputStream)raf;
Run Code Online (Sandbox Code Playgroud)
RandomAccessFile应该是子类,InputStream虽然不是直接的.
来自docs:
RandomAccessFile实现DataInput哪些内容DataInputstream&InputStream
为什么这个无效?
还要感谢您对使用RandomAccessFileas 的正确方法的输入InputStream?
我在想包装方法.
我将为物理专业的学生做一个关于Java的讲座,我想知道如何正确打开文件。
在我的许多专业应用程序中,我做了类似的事情:
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("file")));
try{
....
}finally {
bufferedWriter.close();
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,没关系,即阅读器将始终关闭。
当我将其作为我的学生的示例时,我想知道如果构造函数InputStreamReader抛出异常会发生什么 --- FileInputStream 将打开,但它不会被我的代码关闭(因为这些对象是在 try-finally 之外创建的)堵塞。
那么这是正确的习语吗?如果是的话那为什么呢?如果打开流不是正确的习惯用法,请给我指出正确的习惯用法!
编辑:我正在寻找既正确又易于编写和理解的习语,物理学生是编程的初学者。
编辑:愚蠢的我,我复制了错误的示例 --- 如果我使用作家而不是读者,它会变得更加复杂。
如果
FileInputStream fileIS = new FileInputStream(filePathStr);
DataInputStream dataIS = new DataInputStream(fileIS);
Run Code Online (Sandbox Code Playgroud)
关闭fileIS会自动关闭dataIS,因为dataIS是传播fileIS还是dataIS也应该单独关闭?
谢谢
您好我使用通用图像加载器从设备加载图像,现在它可以工作,但如果文件路径包含"空格字符",图像不会显示,日志记录显示有一个FileNotFoundException.
我尝试使用java io在一个线程中打开该文件,它打开,我可以读取它.
文件名:
/mnt/sdcard/WhatsApp/Media/WhatsApp Images/IMG-20121014-WA0001.jp
Run Code Online (Sandbox Code Playgroud)
当抛出Exception时,
用a替换空格,%20这就是抛出异常的原因.
我的代码:
ImageLoader.getInstance().displayImage(
Uri.fromFile(
new File(cursor.getString(cursor.getColumnIndex(
MediaStore.Images.Media.DATA)))).toString(),
holder.mImage);
Run Code Online (Sandbox Code Playgroud)
仅当路径中没有空格时才有效,
任何帮助
在我正在阅读Java的书中,它通过使用写入文件并将其存储的程序来演示序列化.我收到一个奇怪的错误,我不知道如何阅读,它拒绝我访问创建.txt文件.这是错误:
Exception in thread "main" java.io.FileNotFoundException: C:\testFile.txt (Access is denied)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at serializableTests.MyProgram.main(MyProgram.java:18)
Run Code Online (Sandbox Code Playgroud)
这是该计划的两个类:
用户类:
public class User implements Serializable {
private static final long serialVersionUID = 4415605180317327265L;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Run Code Online (Sandbox Code Playgroud)
这是主要课程:
import java.io.File;
import java.io.FileOutputStream; …Run Code Online (Sandbox Code Playgroud) 在阅读完@Peter Lawrey的答案后,尤其是这句话:
close()可以确保将文件实际写入磁盘(或不取决于操作系统)
(重点是我的。)
我有3个问题:
确实没有保证在调用后所有字节在磁盘上都可用close()吗?(我想这是真的,因为它来自@Peter Lawrey)
通常(即在所有操作系统上均有效),确保所有字节有效写入磁盘的最佳方法是什么?(我可以想象计数写入到流中的字节,并等待直到 file.length() == byteCount ...但是有更好的方法吗?)
尤其是在Android上,调用fileOutputStream.close()以确保将所有字节有效地写入文件系统是否足够?
这是一些代码(忽略异常,为了简单起见)来说明我的帖子
final InputStream instream = getInputStreamFromSomewhere();
final FileOutputStream outputstream = new FileOutputStream(someExistingFile);
int l;
final byte[] tmp = new byte[1024];
while ((l = instream.read(tmp)) != -1) {
outstream.write(tmp, 0, l);
}
instream.close();
//outputStream.flush(); //useless call since outputStream.flush() do nothing on FileOutputStream
outputStream.close();
//at this point : are all bytes written to disk ?
Run Code Online (Sandbox Code Playgroud) 如果我有一个包含很多文件的目录(大约1000个文件).其中一些文件名为.processed而其他文件没有.
如何仅列出10个未处理的文件.
我正在使用此代码来过滤处理过的文件.
File[] inputFileList = inputDirectory.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return !pathname.getName().endsWith(".processed");
}
});
Run Code Online (Sandbox Code Playgroud)
但是,如果未处理的文件数量很大,这可能会导致内存错误.所以我每次运行应用程序时都需要读取有限数量的文件.
我在 Spring 框架中有以下 java 代码将多部分文件转换为常规文件:
public static File convertToFile(MultipartFile multipart) {
File convFile = null;
try {
convFile = File.createTempFile(multipart.getOriginalFilename(), "");
multipart.transferTo(convFile);
} catch (IllegalStateException | IOException e) {
}
return convFile;
}
Run Code Online (Sandbox Code Playgroud)
当我检查这个临时文件的创建位置时,我可以看到该文件,但文件大小为0,没有内容。
为什么会出现这种情况?我应该怎么办?
更新1
FileNotFoundException执行时会抛出异常transferTo,但它引用的地址似乎是错误的:java.io.FileNotFoundException: /tmp/tmp/filename.png82482347 (No such file or directory)
而多部分文件的地址convFile是/tmp/filename.png82482347,原始文件名是filename.png82482347
我确认多部分文件大小大于 0,这意味着它不为空。
这是堆栈跟踪:
ava.io.FileNotFoundException: /tmp/tmp/filename.png82482347 (No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at org.eclipse.jetty.util.MultiPartInputStreamParser$MultiPart.write(MultiPartInputStreamParser.java:260)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.transferTo(StandardMultipartHttpServletRequest.java:302)
at com.boot.cut_costs.utils.CommonUtils.convertToFile(CommonUtils.java:80)
at com.boot.cut_costs.utils.AWS.S3Services.uploadFile(S3Services.java:30) …Run Code Online (Sandbox Code Playgroud) 这是我第一次在 Java 中使用 Files.walk,我非常喜欢它,尤其是 Path 类。它坚固耐用且用途广泛。
然而,我不喜欢的是,当遍历文件夹时,如果迭代器遇到障碍......就像它遇到了用户无权查看的文件夹或在抛出后可能遇到的任何错误例外的是,它不会继续,也不会产生要使用的路径列表。
这是我如何使用该方法的示例:
try {
Stream<Path> paths = Files.walk(rootPath);
List<Path> pathList = paths.collect(Collectors.toList());
for (Path path : pathList) {
//Processing code here
}
}
catch (FileSystemException a) {System.err.format("FileSystemException: %s%n", a);System.out.println(a.getStackTrace());}
catch (UncheckedIOException b) {System.err.format("UncheckedIOException: %s%n", b);System.out.println(b.getCause().getLocalizedMessage());}
catch (IOException c) { System.err.format("IOException: %s%n", c);System.out.println(c.getStackTrace());}
Run Code Online (Sandbox Code Playgroud)
现在,如果 Files.walk 方法在尝试遍历文件夹时遇到某种错误,它会抛出异常,当然代码会在捕获异常后继续执行。
我想要它做的是忽略它遇到的任何问题,并继续迭代它可以遍历的任何文件夹,而不会停止。
这可能吗?