好的,所以我目前正在尝试选择目录中的最新文件(本例中为/ FSTP / LOGS),但我想忽略任何包含String" DEBUG - null"的文件。 ,但不是字符串" DEBUG - MA"或"信息 - MA"。这些搜索项分别通过sTechNull,sTechValid和sTechValidInfo实例化。
我想跳过我的参数认为为null的文件(必须在文件中有' MA'方面,准确报告),然后转到包含数据的下一个文件I& #39;我在Scanner中寻找。
我尝试了一个do-while循环,但我似乎没有正确。我也不确定是否应检查这些字符串并减少File lastModifiedFile以获取我需要包含非空数据的文件。
我知道下面的代码不正确。我只是想念我做错了什么。为了澄清,当此方法触发时,它将设置扫描程序在另一种方法中读取的最新的非空文件。如果lastModified()方法返回包含我不想要的数据的文件,我想跳过该文件,并选择要为非空数据读取的下一个文件,依此类推。一旦代码到达可接受的文件以传递给单独的方法,它将停止,直到下一次调用recentLog()方法时才会运行。
希望我明白这一点!
我应该如何跳过我认为为null的文件?
private static void recentLog() {
File dir = new File(String.valueOf(Environment.getExternalStorageDirectory() + "/FSTP/LOGS/"));
File[] files = dir.listFiles();
{
if (files.length == 0) return;
File lastModifiedFile = files[0];
Boolean checkNull = null;
do {
for (int i = 1; i < files.length; i++) {
if (lastModifiedFile.lastModified() < files[i].lastModified())
lastModifiedFile = files[i];
try (Scanner scanner = new Scanner(lastModifiedFile)) {
String sTechNull = "DEBUG - null";
String sTechValid = "DEBUG - MA";
String s1Check = scanner.next();
while (scanner.hasNextLine() && !s1Check.equals("exit")) {
String line = scanner.nextLine();
if (s1Check.equals(R.string.exit)) scanner.close();
if (line.contains(sTechNull) && !line.contains(sTechValid)) {
checkNull = true;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}while(checkNull);
lMod = lastModifiedFile.getAbsolutePath();
}
}
我想为不清楚而道歉,但看到我的解决方案形式帮助我理解如何更好地说出我的问题,以及如何决定哪个设置会产生我正在寻找的行为。我最终决定阅读最新的文件,无论内容如何,只是根据下面设置的条件检查我的日志记录脚本是否有效:
public static File recentLog() {
File dir = new File(String.valueOf(Environment.getExternalStorageDirectory() + "/FSTP/LOGS/"));
File[] files = dir.listFiles();
{
if (files.length == 0) return null;
File lastModifiedFile = files[0];
for (int i = 1; i < files.length; i++) {
if (lastModifiedFile.lastModified() < files[i].lastModified())
lastModifiedFile = files[i];
}
lMod = lastModifiedFile.getAbsolutePath();
}
return null;
}
上述方法选择最新文件。
if (line.contains("DEBUG - null") && !(line.contains("DEBUG - MA") || line.contains("INFO - MA"))) {
foundTech = null;
dateLogged = null;
}
上面我已经插入我的第一个扫描仪方法,我将通过我的&#34;有效&#34;文件进入,但我觉得使用扫描仪两次有点多余,所以我通过寻找我的日志文件不包含任何&#34; DEBUG - MA&#34;或&#34; INFO - MA&#34;字符串,但确实包括&#34; DEBUG - null&#34;,并将我想要的值分配给null。
public static string runLogger() throws IOException{
final String fTech = foundTech;
if (fTech != null) {
log.delete();
log.createNewFile();
Calendar now = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
FileOutputStream fos = null;
try {.....
.......
}
然后我设置我的xml日志记录方法忽略代码,如果foundTech变量为null,则不执行xml日志记录代码。这提供了我想要的行为,因为如果没有新的有效数据,我不想更新.xml文件。我所描述的内容会在我的文件列表中向后读取,直到找到有效数据,并且每次都报告它。我发现该方法比日志记录方法中的简单条件语句更难维护。我的文件.lastModified()方法对我来说已经很好了,所以我决定尝试提前过滤掉坏文件。通过思考我的解决方案让我意识到我确实想要读取最新的文件并将该变量传递给我的runLogger()方法,所以我将关闭这个问题。
对于这一切的混乱,我很抱歉,我只是第一次在水域航行的新手。从好的方面来说,我刚刚完成了我的第一个Java / Android项目,现在我已经进入测试阶段,一切正常!感谢StackO的指导!
答案 0 :(得分:2)
将内容过滤器代码拆分为单独的方法:
private static boolean accept(File file)
{
// this is what I gather from your description
boolean containsNull = false;
boolean containsMA = false;
try (Scanner scanner = new Scanner(file))
{
while (scanner.hasNextLine())
{
final String line = scanner.nextLine();
if (line.contains("DEBUG - null"))
{
containsNull = true;
}
if (line.contains("DEBUG - MA") || line.contains("INFO - MA"))
{
containsMA = true;
}
}
return containsMA || !containsNull;
}
catch (FileNotFoundException e)
{
return false;
}
}
然后要确定最新的文件是可接受的,首先对文件进行排序,然后逐个将它们提供给过滤方法,一旦找到第一个匹配就停止:
private static File recentLog(File directory)
{
File[] files = directory.listFiles();
// sort
Arrays.sort(files, new Comparator<File>()
{
@Override
public int compare(File f1, File f2)
{
// reverse comparison, looking for the highest value of lastModified
return -Long.compare(f1.lastModified(), f2.lastModified());
}
});
// find first acceptable file
for (File file : files)
{
if (accept(file))
{
return file;
}
}
// no acceptable files found
return null;
}