对文件搜索优化
明白两件事情:
过滤器中的accept 是谁调用的
accept 方法的参数pathname 是什么
listFiles方法一共做了3件事情:
1、对构造方法中传递的目录进行遍历,获取目录中的每一个文件(夹), 被封装成File对象
2、listFiles方法会调用参数传递的过滤器中的方法accept
3、listFiles会把遍历得到的每一个File对象传递给accept 方法的参数pathname。返回一个true
accept 方法返回值是一个boolean.若返回true 会把传递过去的File对象保存到file数组中,返回false不会保存到数组中
过滤的规则: accept 中判断File 对象是否以.xmind结尾,是返回true ,不是返回false
package com.company.demo02.Recursion;
import com.company.demo03Filter.FileFilterImp;
import java.io.File;
/**
* @author 杜艳艳
* @version 1.0
* @date 2020/12/24 16:49
* 只要.xmind结尾的文件。可以用过滤器来实现,。在File 类中有两个和listFiles重载的方法, 方法的参数传递的就是过滤器
* 1、java.io 包下的 public interface FileFilter:抽象路径名(File对象)的过滤器。
* 作用:用来过滤文件。File 对象
* 有个抽象方法 boolean = accept(File pathname),用来过滤文件的方法
* 参数:File pathname :使用listFiles方法遍历目录,得到的每一个文件对象
*
* 2、java.io 包下的 public interface FilenameFilter,文件名称过滤器
* 实现此接口的类的实例用于过滤文件名。 这些实例用于过滤类File的list方法中的目录列表,以及Abstract Window Toolkit的文件对话框组件。
* 有个抽象方法 boolean accept(File dir, String name)
* dir - 构造方法中传递的遍历的/找到该文件的目录。
* name - 使用listFiles方法遍历目录获取的每一个文件/夹的名称。
* 结果
* true当且仅当名称应包含在文件列表中时; 否则为false 。
* 注意:
* 两个过滤器接口,没有实现类,需要自己写实现类,重写过滤的方法accept。 在方法中自己定义过滤的规则
*/
public class Demo06Recursion {
public static void main(String[] args) {
File file = new File("D:\\工作信息\\数仓");
getAllFile(file);
}
/*定义一个方法,参数传递file 类型的目录
方法对目录遍历
*/
public static void getAllFile(File dir){
File[] file = dir.listFiles(new FileFilterImp()); //传递过滤器对象
/*
过滤器的原理
listFiles一共做了3件事情:
1、对构造方法中传递的目录进行遍历,获取目录中的每一个文件/夹, 被封装成File对象
2、listFiles方法会调用参数传递的过滤器中的方法accept
3、listFiles会把遍历得到的每一个File对象传递给accept方法的参数pathname。返回一个true
accept方法返回值是一个boolean.返回true 会把传递过去的File对象保存到file数组中,返回false不会保存到数组中
过滤的规则:
accept中判断对象file 对象是否以xmind结尾,是返回true ,不是返回false
*/
/*
解决办法:
需要对遍历到的file1是否是文件夹,如果是文件夹,则继续遍历则文件夹file1 。 调用getAllFile()即可。
如果是文件,直接打印即可。
*/
for (File file1 : file) {
if (file1.isDirectory()){
getAllFile(file1);
}
else{
//file1是一个文件,直接打印即可
System.out.println(file1);
}
}
}
}
package com.company.demo03Filter;
import java.io.File;
import java.io.FileFilter;
/**
* @author 杜艳艳
* @version 1.0
* @date 2020/12/24 17:09
* 创建过滤器FileFilter的实现类,重写过滤方法accept .定义过滤规则
*/
public class FileFilterImp implements FileFilter {
@Override
public boolean accept(File pathname) {
/*
过滤的规则:
accept中判断对象file 对象是否以xmind结尾,是返回true ,不是返回false
*/
//如果pathname 是文件夹,返回true继续遍历文件夹。 返回true ,把文件夹放到数组里。
if (pathname.isDirectory()){
return true;
}
return pathname.getName().toLowerCase().endsWith(".xmind");
// return true; // 所有的文件都有
//return false; 所有的文件都没
}
}
package com.company.demo03Filter;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
/**
* @author 杜艳艳
* @version 1.0
* @date 2020/12/24 16:49
* 只要.xmind结尾的文件。可以用过滤器来实现,。在File 类中有两个和listFiles重载的方法, 方法的参数传递的就是过滤器
* 1、java.io 包下的 public interface FileFilter:抽象路径名(File对象)的过滤器。
* 作用:用来过滤文件。File 对象
* 有个抽象方法 boolean = accept(File pathname),用来过滤文件的方法
* 参数:File pathname :使用listFiles方法遍历目录,得到的每一个文件对象
*
* 2、java.io 包下的 public interface FilenameFilter,文件名称过滤器
* 实现此接口的类的实例用于过滤文件名。 这些实例用于过滤类File的list方法中的目录列表,以及Abstract Window Toolkit的文件对话框组件。
* 有个抽象方法 boolean accept(File dir, String name)
* dir - 构造方法中传递的遍历的/找到该文件的目录。
* name - 使用listFiles方法遍历目录获取的每一个文件/夹的名称。
* 结果
* true当且仅当名称应包含在文件列表中时; 否则为false 。
* 注意:
* 两个过滤器接口,没有实现类,需要自己写实现类,重写过滤的方法accept。 在方法中自己定义过滤的规则
*/
public class Demo06Recursion2 {
public static void main(String[] args) {
File file = new File("D:\\工作信息\\数仓");
getAllFile(file);
}
/*定义一个方法,参数传递file 类型的目录
方法对目录遍历
*/
public static void getAllFile(File dir){
//传递过滤器对象,使用匿名内部类
/*
File[] file = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//过滤规则,是文件夹,或 是.xming ,返回true
return pathname.isDirectory()|| pathname.getName().toLowerCase().endsWith(".xmind");
}
});
*/
//lambda 表达式优化
File[] file = dir.listFiles(( pathname)->
pathname.isDirectory()|| pathname.getName().toLowerCase().endsWith(".xmind")
);
/*File[] file = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory() || name.toLowerCase().endsWith("xmind");
}
});*/
//上面可以简化,使用lambda 表达式,优化匿名类。使用前提:接口中只有一个抽象方法。
/*File[] file = dir.listFiles((File di, String name) ->{
return new File(di,name).isDirectory() || name.toLowerCase().endsWith("xmind");
});*/
//上面继续简化
/* File[] file = dir.listFiles(( di, name) ->
new File(di,name).isDirectory() || name.toLowerCase().endsWith("xmind")
);*/
/*
过滤器的原理
listFiles一共做了3件事情:
1、对构造方法中传递的目录进行遍历,获取目录中的每一个文件/夹, 被封装成File对象
2、listFiles方法会调用参数传递的过滤器中的方法accept
3、listFiles会把遍历得到的每一个File对象传递给accept方法的参数pathname。返回一个true
accept方法返回值是一个boolean.返回true 会把传递过去的File对象保存到file数组中,返回false不会保存到数组中
过滤的规则:
accept中判断对象file 对象是否以xmind结尾,是返回true ,不是返回false
*/
/*
解决办法:
需要对遍历到的file1是否是文件夹,如果是文件夹,则继续遍历则文件夹file1 。 调用getAllFile()即可。
如果是文件,直接打印即可。
*/
for (File file1 : file) {
if (file1.isDirectory()){
getAllFile(file1);
}
else{
//file1是一个文件,直接打印即可
System.out.println(file1);
}
}
}
}
持续用lambda 表达式优化
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告
这个问题在这里已经有了答案:Whatdoes`if__FILE__==$0`meaninRuby(6个答案)关闭6年前。我在审查Ruby代码时偶然发现了这个语法。代码是:if__FILE__==$PROGRAM_NAME#somecode...end我想__FILE__是一个变量,可以让我获取我所在文件的名称?但是$PROGRAM_NAME简化了什么?另外,为什么这个if语句是必需的,因为程序可以使用或不使用它?