在本文中,我们将带你了解javafile海量文件处理在这篇文章中,我们将为您详细介绍javafile海量文件处理的方方面面,并解答java中的file文件类详解常见的疑惑,同时我们还将给您一些技巧,以
在本文中,我们将带你了解java file 海量文件处理在这篇文章中,我们将为您详细介绍java file 海量文件处理的方方面面,并解答java中的file文件类详解常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的android java.io.File.fixSlashes(File.java:185)、Django staticfiles app 静态文件处理/引用、Django模板静态文件处理和媒体文件处理、File 文件处理。
本文目录一览:- java file 海量文件处理(java中的file文件类详解)
- android java.io.File.fixSlashes(File.java:185)
- Django staticfiles app 静态文件处理/引用
- Django模板静态文件处理和媒体文件处理
- File 文件处理
java file 海量文件处理(java中的file文件类详解)
java file 海量文件处理 博客分类: java最近在做一个文件处理的系统。大概就是扫描一个文件里面所有的子文件。(文件可能有几百万条,文件不大)
如果有新文件进来。就把这个文件上传到别的服务器上去。然后在服务器在把文件转换数据入库。xml转换成java对象入库。这这里有很多种实现方式。用smb,socket....
在测试中发现性能瓶颈在扫描文件的操作中。当文件夹里面的文件多了。所消耗的时间非常多。
第一种做法:单线程扫描文件夹里面的文件file.listFiles()。当文件夹里面有10多万子文件的时候。发现速度非常慢.有时候还出现堆溢出的现象。后来就改用了file.list();只取出了文件的名称数组
第二种做法:采用多线程分割file.list()数组。发现速度提升了一点。但是不是很多。有可能是我测试机的配置太差了,奔腾,2G内存的机子。
第三种做法:连多线都用上了。性能还是达不到标准啊。怎么办了。结果我用了filefilter试了一下。在刚开始的时候我就知道filefilter可以过滤文件。但是一直对海量文件处理没什么经验。结果。用filefilter过滤文件试了下。本地扫描12w文件只需1.1秒。基本上是。1秒每万条。我想应该filefilter。java底层封装了。filefilter的实现,。所以才有这么快。
android java.io.File.fixSlashes(File.java:185)
java.lang.NullPointerException at java.io.File.fixSlashes(File.java:185) at java.io.File.<init>(File.java:134)
保存图片的功能代码是:
public static String sharePhoto(Context context,Bitmap bmp) { File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Folder"); boolean success = true; String file_path = null; if (!folder.exists()) { success = folder.mkdir(); } if (success) { file_path = folder + "/Img_" + System.currentTimeMillis() / 1000 + ".jpg"; } OutputStream os = null; try { os = new FileOutputStream(file_path); bmp.compress(Bitmap.CompressFormat.JPEG,100,os); } catch (IOException e) { e.printstacktrace(); } } else { // Do something else on failure } Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); File f = new File(file_path); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); context.sendbroadcast(mediaScanIntent); return file_path; }
解决方法
File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/MyFolder");
事实是getExternalStorageDirectory()返回File.您需要获取该文件的绝对路径并与“/ Pictures / MyFolder”连接.
Django staticfiles app 静态文件处理/引用
在使用 django 开发中,不可避免的总会遇到静态文件的处理,特别对于前端来说,页面的调试都是依赖静态文件(JS,CSS,Image等等)
文件分类:
Django 把静态文件分成了两类:static 和 media, Django 是按照是否与用户互动来进行区分:
static: 应用页面需要的(JS,CSS,Image...),这些相对来说是提供给用户的,即这些文件(非严格讲)没有与用户进行互动,开发者产生这些文件为访问用户服务,用户只是单纯的享受应用服务。
media: 用户与应用程序进行交互的文件(用户上传的文件等等)
静态文件设置:
STATIC_ROOT
STATIC_URL
STATICFILES_Dirs
STATICFILES_STORAGE
STATICFILES_FINDERS
文档:https://docs.djangoproject.com/en/2.0/ref/settings/#settings-staticfiles
静态文件引用:
setting.py
xx.html
官方 文档:https://docs.djangoproject.com/en/2.0/ref/contrib/staticfiles/
Django模板静态文件处理和媒体文件处理
1.Django 对css静态文件的处理
我们先来看Django 对css静态文件是怎么处理的,一起来实现一下:
- 第一步:首先需要在settings文件中指定静态文件的存储路径,可以使用Django模板引擎语法提示,如
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"), )
,需要注意的是这种方式必须要在 DEBUG模型下使用,也就是让DEBUG等于True,这个是在settings.py文件中设置的; - 第二步:在static目录中创建一个css目录,创建一个base.css文件, 将之前的base.html页面中的 css样式复制进来;
.header{
color: red;
font-size: 60px;
background-color: black;
height: 100px;
text-align: center;
line-height: 100px;
}
.content{
color: green;
font-size: 60px;
background-color: #eeeeee;
height: 800px;
text-align: center;
line-height: 800px;
}
.footer{
color: green;
font-size: 60px;
background-color: black;
height: 100px;
text-align: center;
}
- 第三步:编辑base.html页面,将内联的css样式删除使用外链的css文件,可以先通过
{% load staticfiles %}
引入加载器staticfiles ,然后再使用模版语法<link rel="stylesheet" href="{% static ''css/base.css'' %}">
的形式导入外部css文件,static表示现在的路径目录;
<!doctype html>
{% load staticfiles %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
# 这里使用到了Django的引擎中引用静态文件的模板语法
# 引用的是static目录下的css/base.css文件
<link rel="stylesheet" href="{% static ''css/base.css'' %}">
</head>
<body>
<div>
今天是星期几呀
</div>
<!-- 内容变化 -->
{% block content %}
<div>
<p>今天是星期一</p>
</div>
{% endblock %}
<div>
好的,谢谢
</div>
</body>
</html>
2.Django 对image静态文件的处理
- 第一步:在settings文件中添加指定静态文件的存储路径,也就是:;
STATIC_URL = ''/static/''
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"), )
- 第二步:在static目录下创建image目录,且拷贝图片到目录下;
- 第三步:引入加载器staticfiles ,然后再使用导入图片;
< img src="{% static ''images/图片名称'' %}" alt="说明">
3.Django 对用户上传图片的处理
Django 对于文件或图片上传在HTML页面中一般是通过form表单附件上传的,一般是使用form的post提交方式,编码类型为:"multipart/form-data";
form表单提交需要csrf token认证 如:{% csrf_token %};
4.图片文件上传
自己选择一个app,我是在usersAPP中操作的:
- 第一步:在usersAPP中的urls.py文件中,添加一条路由,我们需要用到一个处理请求的类,命名为ImageView,然后导入这个类,因为我们还没有创建这个类,所以会代码会报错:
url(r''^images/$'', ImageView.as_view(), name=''image'');
- 第二步:在usersAPP中的views.py文件中,创建处理请求的ImageView类;
class ImageView(View):
def get(self, request):
return render(request, ''image.html'')
def post(self, request):
image = request.FILES.get(''upload'')
image_instance = Image(name=image.name, image=image)
image_instance.save()
return render(request, ''image.html'', {''msg'': ''图片上传成功''})
- 第三步:在usersAPP中的templates目录中,创建images.html;
<!doctype html>
{% load staticfiles %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form action="{% url ''users:image'' %}" method="post" enctype="multipart/form-data">
{# <input type="file" name="upload" accept="image/gif, image/jpeg, image/png, image/jpg">#}
<input type="file" name="upload">
<input type="submit" value="提交">
{% csrf_token %}
</form>
<!-- 显示图片上传成功还是失败 -->
<p> {{ msg }} </p>
</body>
</html>
- 第四步:在usersAPP中的models.py中,创建Image Model表,用来存储用户上传图片的 路径和图片的名称;
class Image(models.Model):
name = models.CharField(max_length=50, verbose_name="图片名称")
image = models.ImageField(upload_to="images/%Y/%m", verbose_name="用户上传的图片", max_length=100)
class Meta:
verbose_name = "用户上传图片"
verbose_name_plural = verbose_name
- 第五步:在setting文件中,添加MEDIA_ROOT,指定图片上传的位置为项目根目录下的 media目录;
MEDIA_ROOT = os.path.join(BASE_DIR, ''media'')
5.图片访问
- 第一步:在users APP中的users 中的urls.py文件中添加:
url(r''^show_images/(?P<image_name>\w+.(png|jpg|jpeg))$'', ShowImageView.as_view(), name=''show_images'')
- 第二步:在users APP中的views.py中,创建请求的ShowImageView类;
class ShowImageView(View):
def get(self, request, image_name):
# 这是一个QuerySet
images = Image.objects.filter(name=image_name)
# 取第一张图片
image = images.first()
return render(request, ''show_image.html'', {''image'': image})
- 第三步:在users APP中的templates目录中,创建show_image.html;
<!doctype html>
{% load staticfiles %}
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<p>用户上传的图片为: </p>
<!-- <img src="../../media/{{ image.image }}" rel="{{ MEDIA_URL }}{{ image.image }}" alt="用户上传图片"> -->
<img src="{{ MEDIA_URL }}{{ image.image }}" alt="用户上传图片">
</body>
</html>
- 第四步:在settings文件中,添加MEDIA_URL;
MEDIA_URL = ''/media/''
''django.template.context_processors.media'',
参考:https://www.9xkd.com/user/plan-view.html?id=2612520594
File 文件处理
将静态文件作为资源添加
如果应用程序需要外部文件资源,那么可以通过将其放置在项目层次结构的 res/raw
文件夹中,从而在自己的分发中包含它。
Resources r = getResources();
InputStream file = r.openRawResource(R.raw.filename);
使用特定于应用程序的文件夹存储文件
Android 下提供了两种创建文件对象:getDir
,getExternalFilesDir
,两个方法都返回一个 File 对象,每个对象都有指向内部或外部存储的目录路径。当应用程序被卸载后,存储在这些目录下的文件都将被删除。
以上两种方法都接收一个字符串参数,指定用于存放文件的子路径,在 Environment 类中引入了许多 DIRECTORY_[Category]字符串常量,这些常量用来表示标准目录名称,例如:下载目录、图片目录、影视目录、音乐目录、拍照目录
存储在应用程序文件夹中的文件应该市特定于父应用程序的而且通常不会被媒体扫描。
getExternalFilesDir 方法是在 API Level 8 中引入的。要想支持较早的平台版本,可以调用
Environment.getExternalStorageDirectory()
获取外部存储根路径。
最好在应用程序自己的子目录下存储特定于该应用程序的数据,即:/android/data/data/Your Package Path/files
如果使用上面方式,当应用程序被卸载时不会将自动删除该应用程序的文件。
创建私有的应用程序
Android 提供了 openFileInput
和 openFileOutput
方法来简化从应用程序沙箱中的文件读取和写入数据流。
创建 FileOutputStream 时,如果你指定的文件名不存在,Android 会为你创建。对于已经存在的文件的默认行为就是覆盖它;想要在文件末尾追加内容,可以指定模式为 Context.MODE_APPEND
。
默认情况下,使用 openFileOutput
方法创建的文件对于调用程序市私有的,其他应用程序都无法访问。在不同应用程序间共享文件的标准方式是使用一个 Context Provider。
- Context.MODE_WORLD_READABLE 创建一个可读的公共访问的 FileOutputStream
- Context.MODE_WORLD_WRITEABLE 创建一个可写的公共访问的 FileInputStream
- Context.MODE_APPEND 创建一个可以追加的 FileOutputStream
- Context.PRIVATE 创建私有的文件
使用应用程序文件缓存
Android 提供了一个可管理的内部缓存,分别调用 getCacheDir
和 getExternalCacheDir
方法可以从当前上下文中访问它们。存储在缓存中的文件,在应用程序被卸载时都会被删除。当系统运行在低可用存储空间时,存储在内部缓存中的文件可能被系统所删除;存储在外部缓存中的文件则不会被删除。
这两种情况下,这是用来监控和管理缓存的大小和寿命很好的方式,当超出合理的最大缓存的大小的时候去删除文件。
存储公共可读的文件
API Level 8 还提供了一个便捷的方法 Environment.getExternalStoragePublicDirectory,可以用来找到存储应用程序文件的路径。方便返回每个类型文件的存储路径。
下面是 Environment 常用文件类型的常量:
- DIRECTORY_ALARMS 警示音
- DIRECTORY_DCIM 拍照和视频
- DIRECTORY_DOCUMENTS 文档文件
- DIRECTORY_DOWNLOADS 下载文件
- DIRECTORY_PICTURES 图片文件
- DIRECTORY_MOVIES 电影文件
- DIRECTORY_NOTIFICATIONS 代表用户选择的通知音和可用的音频文件
- DIRECTORY_RINGTONES 代表用户可选择的铃声和可用的音频文件
- DIRECTORY_PODCASTS 代表播客的音频文件
- DIRECTORY_MUSIC 音乐文件
我们今天的关于java file 海量文件处理和java中的file文件类详解的分享就到这里,谢谢您的阅读,如果想了解更多关于android java.io.File.fixSlashes(File.java:185)、Django staticfiles app 静态文件处理/引用、Django模板静态文件处理和媒体文件处理、File 文件处理的相关信息,可以在本站进行搜索。
本文标签: