我Files.WalkFileTree()用来导航文件夹和计算音频文件,但遇到tar文件时出现问题,它似乎将它视为一个实际的文件夹我期望它只是跳过它.
我看不到任何让我控制这种行为的选项
码:
package com.jthink.songkong.fileloader;
import com.jthink.songkong.cmdline.SongKong;
import com.jthink.songkong.ui.MainWindow;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.Callable;
import java.util.logging.Level;
/**
* Count the number of files that can be loaded, for information purposes only
*/
public class CountFilesinFolder implements Callable<Boolean> {
public static class CountFiles
extends SimpleFileVisitor<Path> {
private int fileCount = 0;
private final PathMatcher matcher;
CountFiles(String pattern) {
matcher =
FileSystems.getDefault()
.getPathMatcher("regex:" + pattern);
}
/**
* Find Music file
*
* @param file
* @param attr
* …Run Code Online (Sandbox Code Playgroud) 我在Jetty上运行的java webservice在几个小时之后就会崩溃并且调查表明许多套接字处于CLOSE_WAIT状态.虽然它工作正常但似乎没有CLOSE_WAIT状态的套接字,但是当它出错时会有负载.
我找到了这个定义
CLOSE-WAIT:本地端点已收到连接终止请求并确认它,例如已执行被动关闭,并且本地端点需要执行主动关闭才能离开此状态.
在我的服务器上使用netstat,我看到一个CLOSE_WAIT状态的tcp套接字列表,本地地址是我的服务器,外部地址是我的负载均衡器机器.所以我认为这意味着客户端(负载均衡器)刚刚以某种不正确的方式终止了它的连接,而我的服务器没有正确地关闭它的连接.
但是我该怎么做,我的Java代码不处理低级套接字?
或者是负载平衡器终止连接,因为我的服务器在代码中出错了导致的早期问题.
即使我将内容类型设置为text/html,它最终也会成为S3上的application/octet-stream.
ByteArrayInputStream contentsAsStream = new ByteArrayInputStream(contentAsBytes);
ObjectMetadata md = new ObjectMetadata();
md.setContentLength(contentAsBytes.length);
md.setContentType("text/html");
s3.putObject(new PutObjectRequest(ARTIST_BUCKET_NAME, artistId, contentsAsStream, md));
Run Code Online (Sandbox Code Playgroud)
但是,如果我将文件命名为最终使用.html
s3.putObject(new PutObjectRequest(ARTIST_BUCKET_NAME, artistId + ".html", contentsAsStream, md));
Run Code Online (Sandbox Code Playgroud)
然后它工作.
我的md对象被忽略了吗?我如何以编程方式绕过这个,因为随着时间的推移,我需要上传数千个文件,因此不能只进入S3 UI并手动修复contentType.
我有一些用Java 6编写的文件I/0遍历代码,试图将它移动到Java 7中的新I/O但我找不到任何替代这种东西.
File[] files = dir.listFiles(AudioFileFilter.getInstance());
Run Code Online (Sandbox Code Playgroud)
即,没有办法只过滤路径文件,它返回文件列表,所以我必须将每个文件转换为路径(file.toPath),如果我想限制在它调用的方法中使用File,这似乎相当费力.
我确实看过FileVisitor,但这似乎不允许你控制树的遍历方式,所以我认为它不会对我有用.
那么Java 7中的Path for File有多少替代品呢?
所以我通过id得到了一个特定实体的实例
for(Integer songId:songGroup.getSongIds()) {
session = HibernateUtil.getSession();
Song song = (Song) session.get(Song.class,id);
processSong(song);
}
Run Code Online (Sandbox Code Playgroud)
这会为每个id生成一个sql查询,所以我觉得我应该在一个中执行此操作,但是除了运行查询之外,我找不到在一次调用中获取多个实体的方法.所以我写了一个查询
return (List) session.createCriteria(Song.class)
.add(Restrictions.in("id",ids)).list();
Run Code Online (Sandbox Code Playgroud)
但是,如果我启用第二级缓存并不意味着我的旧方法将能够从二级缓存返回对象(如果之前已经请求过),但我的查询将始终转到数据库.
这样做的正确方法是什么?
我的servlet应用程序部署到direct.albunack.net,www.albunack.net上有一个CloudFront缓存.
默认页面(index.jsp)是(艺术家)搜索.假设我们正在使用direct.albunack.net进入搜索并提交搜索到direct.albunack.net/artist/search./ artist下的所有内容都映射到一个servlet,这个servlet进行搜索,如果它只找到一个结果,那么它会重定向到direct.albunack.net/artist/ artistid - 这使用相同的servlet为该艺术家构建一个页面把它返还.
如果相反它找到多个结果然后将结果转发回index.jsp但显示多个结果,如果用户然后点击其中一个结果,它们将再次重定向到direct.albunack.net/artist/ artistid
到目前为止一直很好,当我使用www.albunack.net时会出现问题.Cloudfront默认(*)行为是缓存所有请求,而不是转发标头ectera.但是我们为/ artist/search路径添加了另一种行为,因此它不会缓存实际搜索.
当它找到多个结果时,它会重定向到http://www.albunack.net/index.jsp,然后点击其中一个选项重定向到http://www.albunack.net/artist/ artistid.
但我的问题(我认为)是因为搜索委托给direct.albunack.net时只有一个选择它重定向到http:// direct .albunack.net/artist/artistid绕过缓存并暴露我们的直接接口.
那么我该如何对此进行编码,如果我实际上对包括服务器在内的完整路径进行硬编码,那么在本地运行时它将不起作用,这是正确的方法.
Servlet代码提取:
if (!Strings.isNullOrEmpty(artistName))
{
//Look up artist for that id
MusicBrainzSearchArtist mbArtistSearch = new MusicBrainzSearchArtist();
List<Artist> mbArtists = mbArtistSearch.queryByArtistName(artistName);
if (mbArtists.size() == 0)
{
request.setAttribute(ERROR, InfoMessage.MSG_NO_RESULTS_FOUND.getMsg(artistName));
request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}
else if (mbArtists.size() == 1)
{
response.sendRedirect("/artist/" + mbArtists.get(0).getId());
return;
}
else
{
request.setAttribute(ERROR, InfoMessage.MSG_MULTIPLE_RESULTS_FOUND.getMsg(artistName));
request.setAttribute("results", mbArtists);
request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}
} …Run Code Online (Sandbox Code Playgroud) 我试图使用Maven构建一个独立的应用程序
使用如何使用Maven创建具有完整依赖关系的独立应用程序中描述的程序集插件 ?
这将创建包含的小部件分发zip
widget-1.0
widget-1.0/lib/widget.jar
widget-1.0/lib/3rdpartyjar1.jar
widget-1.0/lib/3rdpartyjar2.jar
Run Code Online (Sandbox Code Playgroud)
...
但在我的src树中,我有:
src/main/bin/widget.sh
Run Code Online (Sandbox Code Playgroud)
这并没有进入最终分发拉链,我希望它能够到这里
widget-1.0/widget.sh
Run Code Online (Sandbox Code Playgroud)
同样在我的src树中,我有一个属性文件
src/main/properties/widget.properties
Run Code Online (Sandbox Code Playgroud)
目前正在进入
widget-1.0/lib/widget.jar
Run Code Online (Sandbox Code Playgroud)
但是因为我希望它可以编辑,我希望它能够存在
widget-1.0/widget.properties
Run Code Online (Sandbox Code Playgroud)
是否可以在maven中执行此操作?
编辑 使用博客中的信息得到如下工作:
这是新的xml
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>distribution</id>
<formats>
<format>zip</format>
</formats>
<dependencySets>
<dependencySet>
<scope>runtime</scope>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.scriptSourceDirectory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>widget.sh</include>
<include>widget.properties</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Run Code Online (Sandbox Code Playgroud)
但是小点但无法在任何地方找到maven标准文件夹变量的列表,即对于properties文件夹是否有相当于$ {project.build.scriptSourceDirectory}的内容
我使用线程池来执行任务,这些任务主要是基于cpu的I/O,大小比cpus的数量大1.
Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)
Run Code Online (Sandbox Code Playgroud)
简单的程序的假设情况下提交的所有任务,在此执行程序并没有什么别的我假设有一个线程池的任何较大会减慢事情,因为操作系统将不得不时间片它的CPU往往机会给每个线程的线程池机会跑.
这是正确的,如果这是一个真正的问题或主要是理论上的,即如果我将线程池大小增加到1000我会注意到一个巨大的差异.
我有一个java.time.Duration,我想以mm:ss的形式输出它.似乎不可能使用DateTimeFormatter,因为它只接受LocalTime,ZonedTIme ectera
所以我这样做了,工作正常90秒给1:30,但66秒给出1:6而我想要1:06
Duration duration = Duration.ofSeconds(track.getLength().longValue());
System.out.println(duration.toMinutes() + ":" + duration.minusMinutes(duration.toMinutes()).getSeconds());
Run Code Online (Sandbox Code Playgroud) 我得到不同的结果为Files.exists(path),以path.toFile().exists()在Windows本地文件.我可以在Windows资源管理器中看到这个文件,虽然我有(随机)修改过的权限,也许权限没有意义.
但是,这并不能解释为什么旧方法返回true并且新方法返回false.该文件确定存在但可能对运行Java代码的用户不可见,因此我不确定应该是什么样的正确答案.我也无法看到如何查看哪个用户正在运行代码,计算机上只有一个真正的用户Paul,但我想知道是否以管理员身份运行或不影响事情.
System.out.println("Path Exists(1):"+Files.exists(path));
System.out.println("Path Exist(2) :"+path.toFile().exists());
Run Code Online (Sandbox Code Playgroud)
给
Path Exists(1):false
Path Exist(2) :true
Run Code Online (Sandbox Code Playgroud)
也
System.out.println("Path readable(3) :"+Files.isReadable(path));
System.out.println("Path readable(4):"+path.toFile().canRead());
Run Code Online (Sandbox Code Playgroud)
以同样的方式给予
Path readable(3) :false
Path readable(4):true
Run Code Online (Sandbox Code Playgroud)
权限输出
File C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf permissions
owner:PCLAPTOP\Paul
NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:DENY
BUILTIN\Administrators:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:DENY
BUILTIN\Administrators:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW
NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW
BUILTIN\Users:READ_DATA/READ_NAMED_ATTRS/EXECUTE/READ_ATTRIBUTES/READ_ACL/SYNCHRONIZE:ALLOW
NT AUTHORITY\Authenticated Users:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/SYNCHRONIZE:ALLOW
c:\Code\jthink\opensrc\jaudiotagger>attrib C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf
A R C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf
Run Code Online (Sandbox Code Playgroud)
更新 我没有得出结论,但认为这些信息可能有用.
我在IntelliJ IDE中运行代码而没有启用IDE Run选项的IDE Run程序,启用此功能后,Java应用程序也获得了管理员权限.
感兴趣的是另一个文件我没有添加任何DENY权限,我只是禁用了继承权限并从所有组中删除了READ权限.然后,当我作为用户运行而没有运行管理员启用它无法读取文件,此代码也无法输出任何信息
AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class);
if (view != null)
{
sb.append("Owner:"+view.getOwner().getName()+"**");
for (AclEntry acl : view.getAcl())
{
sb.append(acl.principal()+"**");
for(AclEntryPermission aep:acl.permissions()) …Run Code Online (Sandbox Code Playgroud)