gpt4 book ai didi

java - 如何跳过包含字符串的 .last Modified() 文件,并选择下一个 .last Modified() 文件

转载 作者:行者123 更新时间:2023-12-02 05:08:19 32 4
gpt4 key购买 nike

好的,所以我当前正在尝试选择目录中的最新文件(本例中为/FSTP/LOGS),但我想忽略包含字符串“DEBUG - null”但不是字符串的任何文件“DEBUG - MA”或“INFO - MA”。这些搜索词分别通过 sTechNull、sTechValid 和 sTechValidInfo 实例化。

我想跳过我的参数认为为空的文件(文件中必须具有“MA”方面,才能准确报告),并转到包含我在此处查找的数据的下一个文件在扫描仪中。

我尝试过 do-while 循环,但似乎不正确。我也不确定是否应该检查这些字符串并递减 File lastModifiedFile 以获取我需要的包含非空数据的文件。

我知道下面的代码不正确。我只是想念我做错了什么。为了澄清,当此方法触发时,它将设置由另一个方法中的扫描程序读取的最新的非空文件。如果lastModified()方法返回的文件包含我不想要的数据,我想跳过该文件,并选择下一个要读取的非空数据文件,依此类推。一旦代码到达可接受的文件以传递给单独的方法,它将停止并且不会运行,直到下次调用recentLog()方法。

希望我说清楚了!

我应该如何跳过我认为为空的文件?

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();
}
}
<小时/><小时/>

编辑:我找到了我的解决方案,你们大多数人都是正确的,我还不够清楚。我尝试使用比较器和单独的验证方法来实现@flup的解决方案。由于对我将要阅读的日志文件进行了进一步研究,我发现这对于我想要完成的任务来说很麻烦。有一些文件包含我在上面查找的所有字符串,因此我决定最好只过滤我在包中创建的日志记录方法以写入 xml 文件。

我想为自己的不清楚而道歉,但是看到我的解决方案的形成帮助我理解了如何更好地表达我的问题,以及如何决定哪种设置会产生我正在寻找的行为。我最终决定读取最新的文件,无论内容如何,​​只需检查我的日志脚本,根据下面设置的条件,数据是否有效:

 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;
}

上面的片段我已经插入到我的第一个扫描仪方法中,我打算将我的“有效”文件传递到其中,但我觉得使用扫描仪两次有点多余,所以我改为通过查找何时使用过滤器我的日志文件不包含任何“DEBUG - MA”或“INFO - MA”字符串,但包含“DEBUG - null”,并将我想要的值分配为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 文件。我所描述的内容会在我的文件列表中向后读取,直到找到有效数据,并每次都报告它。我发现该方法比日志记录方法中的简单条件语句更难维护。我的 file .lastModified() 方法已经对我来说工作得很好,所以我决定尝试提前过滤掉坏文件。仔细思考我的解决方案让我意识到我确实想读取最新的文件并将该变量传递给我的 runLogger() 方法,所以我将关闭这个问题。

很抱歉让这一切变得困惑,我只是一个第一次涉水的新手。从好的方面来说,我刚刚完成了我的第一个 Java/Android 工作项目,现在一切都正常运行,我正在进入测试阶段!感谢 StackO 的指导!

最佳答案

将内容过滤器代码拆分为单独的方法:

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;
}

关于java - 如何跳过包含字符串的 .last Modified() 文件,并选择下一个 .last Modified() 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27571707/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com